Ответ 1
Нет, взгляните на Как работает цикл Java для каждого цикла?
Вы должны изменить свой цикл, чтобы использовать итератор явно или счетчик int.
Предположим, что у меня есть цикл foreach
:
Set<String> names = new HashSet<>();
//some code
for (String name: names) {
//some code
}
Есть ли способ проверить внутри foreach
, что фактическое имя является последним в Set
без счетчика?
(Извините, если это дублированный вопрос, я не нашел здесь несколько таких вопросов)
Нет, взгляните на Как работает цикл Java для каждого цикла?
Вы должны изменить свой цикл, чтобы использовать итератор явно или счетчик int.
Для простоты и понятности, 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(", "));
Другие оповещения полностью адекватны, просто добавив это решение для данного вопроса.
Set<String> names = new HashSet<>();
//some code
int i = 0;
for (String name: names) {
if(i++ == names.size() - 1){
// Last iteration
}
//some code
}
В методе сборки нет способа проверить, является ли текущий элемент также последним элементом. Кроме того, вы используете HashSet
, который не гарантирует возврат заказа. Даже если вы хотите проверить это, например. с индексом i
последний элемент всегда может быть другим.
A Set
не гарантирует порядок над элементами внутри него. Вы можете пройти через Set
один раз и получить "abc" как "последний элемент" , и в следующий раз вы обнаружите, что "hij" - это "последний элемент" в Set
.
При этом, если вас не беспокоит порядок, и вы просто хотите знать, что представляет собой произвольный "последний элемент" при наблюдении Set
в данный момент, для этого не существует встроенного способа. Вам нужно будет использовать счетчик.
.map(String :: toString) из приведенного выше ответа является избыточным, поскольку HashSet уже содержит значения String. Не используйте Set для объединения строк, поскольку порядок не гарантирован.
List<String> nameList = Arrays.asList("Michael", "Kate", "Tom");
String result = nameList.stream().collect(Collectors.joining(", "));
Если вы работаете со сложным объектом, а не просто с простым списком/набором, приведенный ниже код может помочь. Просто добавив функцию карты, чтобы получить нужную строку, прежде чем собирать.
String result = violations.stream().map(e->e.getMessage()).collect(Collectors.joining(", "));