簡體   English   中英

如何復制Iterator對象?

[英]How do I copy Iterator Object?

這是一個示例代碼,正在尋找通用解決方案。

   List<String> names = new ArrayList<String>();
    for(int i=0; i<names.size()-1; i++){
        for(int j=i+1; j<names.size(); j++){
            if(names.get(i) == names.get(j)) {
                //return true;
            }
        }
    }

我想用增強的for循環替換上述for循環。 所以嘗試這樣嘗試。 上面的for循環由迭代器代替:

    String name;
    Iterator<String> itr2;
    Iterator<String> itr1 = names.iterator();
    while(itr1.hasNext()) {
    // for(name=itr1.next(); itr1.hasNext(); ) {
        name = itr1.next();  // iterating itr1
        itr2 = itr1;
        while(itr2.hasNext()){
            if(name.equalsIgnoreCase(itr2.next())) {  // iterating itr2
                return true;
            }
        }
    }

我們正在迭代itr2,但itr1也正在更改。 這是因為假設itr1 = itr2。 是否可以復制迭代器對象而不是分配? 取而代之的是,迭代器也可以使用任何其他邏輯。

謝謝。

如果要使用增強功能,則無論如何都不能直接訪問迭代器,也不能/不應重新分配迭代器。

相反,請嘗試使用子列表和其他索引計數器:

List<String> names = Arrays.asList( "a", "b", "a", "b", "c" );

int i = 0;
for( String n : names.subList( 0, names.size() - 1) ) {
  for( String s : names.subList( i + 1, names.size() ) ) {
    if( n.equals( s )) {
      return true;
    }
  }

  i++;
}

這並沒有比您的原始版本好多少,僅用於教育目的。 可能會有更好的方法實現您的實際目標。

另外,使用Java 8,您可以使用流:

boolean hasDuplicates = IntStream.range( 0, names.size() - 1 )
  .filter( i -> names.subList( i + 1, names.size() ).contains( names.get( i ) ) )
  .findAny()
  .isPresent();

在某種程度上,要復制迭代器,您將需要創建一個新的迭代器。 所以最簡單的事情就是

List<String> itor2 = new LinkedList();
for(String s : itor)
    itor2.add(s);

當然,如果仍然要創建一個新對象,並且只檢查重復項,我將只遍歷該列表一次,如果還沒有看到此值,則將其添加到HashMap這樣的字典中。

似乎您正在嘗試查找列表中是否有重復項(忽略大小寫)。 您不必一定要使用for循環。 如果您正在尋找一個簡單的truefalse值。 您可以:

public boolean hasDuplicatesIgnoreCase(List<String> names)
{
    return names.stream()
            .map(String::toLowerCase)
            .distinct()
            .collect(Collectors.toList())
            .size() != names.size();
}

這不是您所提問題的答案,但可以解決您的問題。 否則,@ Thomas使用子列表將是最佳答案。

好像您要檢查列表中是否已有名稱,如果存在則返回true? 我不確定這是否正確使用,但我設法通過這種方式來達到您要求的效果。

    List<String> names = Arrays.asList( "a", "b", "c", "d", "a" );
    final Set<String> set = new HashSet<>();

    for (String name: names) {
        if (!set.add(name)) return true;
    }

    return false;

當已經添加元素時,set.add返回false,因此嘗試這樣做將告訴我們該名稱是否已經存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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