Как узнать значение итерации для каждого в Java? - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно напечатать некоторые данные на экране, хранящиеся в массиве String, который выглядит следующим образом:

String[] names = {"Joe", "Jessica", "Javi", "James", "Kevin"};

Я пытался выполнить это таким образом, используя предложение for-each:

for (String i: names) {
   System.out.print(name);
   System.out.println(",");
}

Вывод этого будет:

Joe,
Jessica,
Javi,
James,
Kevin,

Но я хочу избавиться от последней запятой. В нормальном каждом предложении я бы просто создал условие if, которое может управлять этим:

for (int i=0; i<names.length; i++) {
    System.out.print(name);

    if(i!=names.length - 1) {
         System.out.println(",");
    }
}

Могу ли я сделать то же самое, но в предложении for-each? Как я могу контролировать, находится ли итерация в последнем разделе данных?

Ответы [ 4 ]

3 голосов
/ 05 февраля 2020

Вы можете использовать это:

var a = String.join(",\n", List.of("a", "b", "c"))

Как @RealSkeptik предлагает, его можно упростить следующим образом:

var a = String.join(",\n", "a", "b", "c")

Я считаю, что это немного более читабельно в этом случае, чем преобразование String s как поток.

Тогда

System.out.println(a)

приводит к:

a,
b,
c
1 голос
/ 05 февраля 2020

Вы можете использовать org.apache.commons.lang3.StringUtils.join(names,",\n");

0 голосов
/ 05 февраля 2020

Я рассмотрю ваш вопрос о том, где вы можете узнать «значение» итерации при использовании расширенного for l oop.

Эквивалентной реализации for-each или улучшенного for l oop для коллекций - это не совсем ваше l oop из for (int i=0; i<names.length; i++), если names - это List.

Эквивалентный l oop, выписанный для for (String i: names), будет выглядит примерно так:

String[] arr = {"Joe", "Jessica", "Javi", "James", "Kevin"};
List<String> names = Arrays.asList(arr);
for (Iterator<String> i = names.iterator(); i.hasNext(); ) {
    String str = i.next();
    System.out.print(str);
    System.out.println(",");
}

Там, где улучшенные циклы for построены на Iterator для Collections, как видно здесь в документации Java 5 от того времени, когда изначально были созданы расширенные циклы for.

Однако в вашем примере вы используете массив.

Для массивов более ранняя документация гласит:

Для Каждая конструкция также применима к массивам, где она скрывает индексную переменную , а не итератор. Следующий метод возвращает сумму значений в массиве int:

Как видите, вы не можете получить доступ к индексной переменной при использовании расширенного for l oop и если вам требуется доступ к нему для массива, вам следует вместо этого прибегнуть к стандартному l oop.

Для вашего текущего примера есть решения, такие как String.join, упомянутые в других ответах, если Вы также не хотите использовать стандартный for l oop, но я думаю, что они уже достаточно хорошо объяснены.

0 голосов
/ 05 февраля 2020
String[] names = {"Joe", "Jessica", "Javi", "James", "Kevin"};
String a = String.join(",\n",names);
System.out.println(a);
...