Определить последнюю итерацию цикла foreach

Предположим, что у меня есть цикл foreach:

Set<String> names = new HashSet<>();

//some code

for (String name: names) {

     //some code

}

Есть ли способ проверить внутри foreach, что фактическое имя является последним в Set без счетчика?

(Извините, если это дублированный вопрос, я не нашел здесь несколько таких вопросов)

Ответ 2

Для простоты и понятности, imo, подойдет:

Set<String> names = new HashSet<>();
Iterator<String> iterator = names.iterator();
    while (iterator.hasNext()) {
        String name = iterator.next();
        //Do stuff
        if (!iterator.hasNext()) {
            //last name 
        }
     }

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

Set<String> names = new HashSet<>();
names.add("Joao");
names.add("Pereira");

//if the result should be Joao, Pereira then something like this may work
String result = names.stream().collect(Collectors.joining(", "));

Ответ 3

Другие оповещения полностью адекватны, просто добавив это решение для данного вопроса.

Set<String> names = new HashSet<>();

   //some code
   int i = 0;

for (String name: names) {
    if(i++ == names.size() - 1){
        // Last iteration
    }
   //some code

}

Ответ 4

В методе сборки нет способа проверить, является ли текущий элемент также последним элементом. Кроме того, вы используете HashSet, который не гарантирует возврат заказа. Даже если вы хотите проверить это, например. с индексом i последний элемент всегда может быть другим.

Ответ 5

A Set не гарантирует порядок над элементами внутри него. Вы можете пройти через Set один раз и получить "abc" как "последний элемент" , и в следующий раз вы обнаружите, что "hij" - это "последний элемент" в Set.

При этом, если вас не беспокоит порядок, и вы просто хотите знать, что представляет собой произвольный "последний элемент" при наблюдении Set в данный момент, для этого не существует встроенного способа. Вам нужно будет использовать счетчик.

Ответ 6

.map(String :: toString) из приведенного выше ответа является избыточным, поскольку HashSet уже содержит значения String. Не используйте Set для объединения строк, поскольку порядок не гарантирован.

List<String> nameList = Arrays.asList("Michael", "Kate", "Tom");
String result = nameList.stream().collect(Collectors.joining(", "));

Ответ 7

Если вы работаете со сложным объектом, а не просто с простым списком/набором, приведенный ниже код может помочь. Просто добавив функцию карты, чтобы получить нужную строку, прежде чем собирать.

String result = violations.stream().map(e->e.getMessage()).collect(Collectors.joining(", "));