这是一个示例代码,正在寻找通用解决方案。

   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();

10-06 14:03