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