簡體   English   中英

檢測最后一次 foreach 循環迭代

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM