Вывод нечётных элементов массива через запятую 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 шт):

Автор решения: Olmicron
string.substring(0,string.length() -1)
→ Ссылка
Автор решения: iksuy

У вас условие выхода из цикла неверное

 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);
}
→ Ссылка
Автор решения: Jackson750
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);
}
→ Ссылка
Автор решения: Anton Shchyrov

Помогите, пожалуйста, как можно убрать запятую в конце?

А зачем вы ее добавляете?

stringBuilder.append(arr[i] + ",");

для каждого элемента в конце добавляется запятая. Тут есть три решения

  1. После цикла удалять из StringBuilder последнюю запятую

    if (stringBuilder.length() > 0)
      stringBuilder.deleteCharAt(stringBuilder.length() - 1)
    
  2. Добавлять запятую перед элементом для всех, кроме первого

    if (stringBuilder.length() > 0)
      stringBuilder.append(',');
    stringBuilder.append(arr[i]);
    
  3. Добавлять нужные элементы в список, а потом вызвать 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++) {
→ Ссылка
Автор решения: Sergey Semendyaev

Есть интересный класс 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());
}
→ Ссылка
Автор решения: Andrew Bystrov

ну и стримы то почему никто не предложил

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);

→ Ссылка