[英]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循环。 如果您正在寻找一个简单的true
或false
值。 您可以:
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.