Вывод нечётных элементов массива через запятую Java
помогите, пожалуйста, разобраться : есть метод printOddNumbers, который принимает массив и выводит в консоль только нечетные числа из него, через запятую. Конец вывода должен перевести курсор на новую строку.
Пример ввода: [3,5,20,8,7,3,100]
Пример вывода: 3,5,7,3
У меня на выходе получается : 3,5,7,3,
То есть мне нужно убрать последнюю запятую.
Помогите, пожалуйста, как можно убрать запятую в конце?
Также у меня не работает этот код в случае если элементы массива отрицательные. Помогите, пожалуйста, найти баг. Заранее спасибо.
Ссылка на онлайн-компилятор с кодом:
https://paiza.io/projects/OVNkb7xbg3IMP9liR15thg?language=java
public static void main(String[] args) {
int[] strArray = new int[]{3, 5, 20, 8, 7, 3, 100};
printOddNumbers(strArray);
}
public static void printOddNumbers(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] % 2 == 1)
if ((i == arr.length - 1)) {
stringBuilder.append(arr[i]);
} else {
stringBuilder.append(arr[i] + ",");
}
}
System.out.println(stringBuilder);
stringBuilder.append(System.getProperty("line.separator"));
}
}
Output: 3,5,7,3,
Ответы (6 шт):
У вас условие выхода из цикла неверное
i < arr.length - 1
единицу не нужно отнимать, из-за этого последний элемент массива вообще не анализируется. Нужно так:
i < arr.length
Эта строчка вообще лишняя, так как она по сути ничего не делает, а перевод строки вам делает System.out.println
stringBuilder.append(System.getProperty("line.separator"));
Условие на запятую неверное, так как оно сработает, только если у вас последний элемент нечетный. Логичнее в данном случае запятую проставлять перед числом, а не после. Для отрицательных берите модуль от остатка. По итогу будет как-то так:
public static void printOddNumbers(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
boolean first = true;
for (int i = 0; i < arr.length; i++) {
if (Math.abs(arr[i] % 2) == 1)
if (first) {
stringBuilder.append(arr[i]);
first = false;
} else {
stringBuilder.append("," + arr[i]);
}
}
System.out.println(stringBuilder);
}
public static void printOddNumbers(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
for (int value : arr) {
if (value % 2 == 1) {
stringBuilder.append(value + ",");
}
}
System.out.println(stringBuilder.substring(0,stringBuilder.length()-1));
}
или
public static void printOddNumbers(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
for (int value : arr) if (value % 2 == 1) stringBuilder.append(value + ",");
stringBuilder.deleteCharAt(stringBuilder.length()-1);
System.out.println(stringBuilder);
}
Помогите, пожалуйста, как можно убрать запятую в конце?
А зачем вы ее добавляете?
stringBuilder.append(arr[i] + ",");
для каждого элемента в конце добавляется запятая. Тут есть три решения
После цикла удалять из StringBuilder последнюю запятую
if (stringBuilder.length() > 0) stringBuilder.deleteCharAt(stringBuilder.length() - 1)Добавлять запятую перед элементом для всех, кроме первого
if (stringBuilder.length() > 0) stringBuilder.append(','); stringBuilder.append(arr[i]);- Добавлять нужные элементы в список, а потом вызвать
Arrays.toString(tmpList)
не работает этот код в случае если элементы массива отрицательные
Потому, что остаток от деления отрицательного нечетного числа на 2 будет -1. Поэтому если проверку на нечетность переписать вот так
if (arr[i] % 2 != 0)
то код будет работать как с положительными, так и с отрицательными числами
Кроме того, при таком цикле
for (int i = 0; i < arr.length - 1; i++) {
вы будете пропускать последний элемент массива. Цикл должен быть таким
for (int i = 0; i < arr.length; i++) {
Есть интересный класс StringJoiner для таких вещей.
Вот пример:
public static void main(String[] args) {
StringJoiner joiner = new StringJoiner(",", "", "\r\n");
int[] arr = {3,5,20,8,7,3,100};
for (int e : arr) {
if (e % 2 != 0)
joiner.add(String.valueOf(e));
}
System.out.println(joiner.toString());
}
ну и стримы то почему никто не предложил
int[] strArray = new int[]{3, 5, 20, 8, 7, 3, 100};
String result = IntStream.of(strArray)
.filter(i -> (i & 1) != 0)
.mapToObj(String::valueOf)
.collect(Collectors.joining(","));
System.out.println(result);