[英]detect last foreach loop iteration
假設我有一些這樣的foreach
循環:
Set<String> names = new HashSet<>();
//some code
for (String name: names) {
//some code
}
有沒有辦法在沒有計數器的情況下檢查foreach
的實際名稱是Set
中的最后一個? 我沒有在這里找到這樣的問題。
為了簡單和易懂,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
}
}
此外,這取決於您要實現的目標。 假設您正在實現通過 coma 分隔每個名稱的常見用例,但未在末尾添加一個空的 coma:
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
}
沒有,看看Java 'for each' 循環是如何工作的?
您必須更改循環以顯式使用迭代器或 int 計數器。
如果您正在處理一個復雜的對象,而不僅僅是一個簡單的列表/設置,下面的代碼可能會有所幫助。 只需添加一個映射函數即可在收集之前實際獲取所需的字符串。
String result = violations.stream().map(e->e.getMessage()).collect(Collectors.joining(", "));
沒有內置方法來檢查當前元素是否也是最后一個元素。 除此之外,您使用的是不保證退貨順序的HashSet
。 即使您想檢查它,例如使用索引i
,最后一個元素也可能總是不同的。
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(", "));
有一種簡單的方法可以做到這一點,拋出一個條件。 考慮這是你的數組:
int odd[] = {1,3,5,7,9,11};
並且您想將其全部打印在一行中,除了最后一個之外,它們之間用“ - ”連字符。
for(int aa:odd) {
System.out.print(aa);
if(odd[odd.length - 1] != aa)
System.out.print(" - ");
}
這種情況
if( odd[odd.length - 1] != aa )
將檢查您是否不在最后一個元素中,因此您仍然可以添加“ - ”,否則您將不會添加它。
是的,有一種方法可以通過使用計數器在foreach
內部檢查它:
Set<String> names = new HashSet<>();
int i = names.size() - 1;
for (String name: names) {
if (i-- == 0) {
// some code for last name
}
//some code
}
考慮一下, names.size()
在循環外只被調用一次。 這使得循環比在循環內多次處理它更快。
List<String> list = Arrays.asList("1", "2", "3");
for (String each : list) {
if (list.indexOf(each) == (list.size() - 1)) {
System.out.println("last loop");
}
}
注意:Set 不是有序集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.