繁体   English   中英

如何使用两个迭代器迭代HashMap?

[英]How to iterate through a HashMap with two iterators?

我想在HashMap中搜索重复项。 目前这是我的HashMap:

HashMap<String, HashMap<String, String>>

我打算创建两个迭代器,一个i和另一个j ,以及两个循环。 第一个while循环将具有i的索引,然后第二个循环将具有j的索引但是j在循环开始之前是==i

Iterator<Entry<String, HashMap<String, String>>> i = listings.entrySet().iterator();
while(i.hasNext()) {
    HashMap<String, String> entry = i.next().getValue();
    Iterator<Entry<String, HashMap<String, String>>> j = i;

    while(j.hasNext()) {
        j.next();
        // DO STUFF
    }
}

但是这不起作用,因为当我调用j.next() ,它也会改变i的索引。

它看起来你想要一个穿过整个映射的迭代器,并且对于每次迭代,你想要另一个迭代器穿过映射的PART,从第一个迭代器当前指向的位置开始。 Java无法设置从中间开始的迭代器。 此外,我不认为迭代器将以特定顺序通过; 因此,如果您尝试创建一个新的迭代器,然后只是跳过前N来达到您想要的点,我就不会指望它能够工作。

您可能想尝试将Map.Entry对象集转换为数组:

Set <Map.Entry<String, HashMap<String, String>>> entrySet =
        listings.entrySet();
Map.Entry<String, HashMap<String, String>>[] entryArr =
    (Map.Entry<String, HashMap<String, String>>[])
        entrySet.toArray ();

for (int i = 0; i < arr.length; i++) {
    for (int j = i; j < arr.length; j++) {
         // something
    }
}

不幸的是,当你使用toArray()时,这会给出关于未经检查的操作的警告,但我不知道如何解决这个问题。

编辑:按照Louis Wasserman的建议(谢谢!):

Set <Map.Entry<String, HashMap<String, String>>> entrySet =
        listings.entrySet();
ArrayList<Map.Entry<String, HashMap<String, String>>> entryArr =
    new ArrayList<Map.Entry<String, HashMap<String, String>>> (entrySet);

for (int i = 0; i < arr.size(); i++) {
    for (int j = i; j < arr.size(); j++) {
         // something; use arr.get(i), arr.get(j) to get at the keys/values
    }
}
j = i

你有两个引用相同的迭代器。

如果你想要另一个迭代器,你需要再次调用.iterator()

我想在HashMap中搜索重复项

假设你的意思是重复 ,你可以这样做

public static <K, V> List<V> duplicatedValues(Map<K, ? extends V> map) {
  Collection<? extends V> values = map.values();
  Set<? extends V> valueSet = new HashSet<V>(values);
  List<V> dupes = new ArrayList<V>();
  if (valueSet.size() != map.size()) {
    for (V value : values) {
      if (!valueSet.remove(value)) {
        // Already seen
        dupes.add(value);
      }
    }
  }
  return dupes;
}

您使用两个引用i and j指向相同的迭代器,因此当一个更改对象的状态时,其他引用也将看到更新的状态。

您需要第一个hashmap中的hashmap条目中的迭代器。

Iterator<Entry<String, HashMap<String, String>>> i = listings.entrySet().iterator();
while(i.hasNext()) {
    HashMap<String, String> entry = i.next().getValue();

    Iterator<Entry<String, HashMap<String, String>>> j = entry.iterator();
    while(j.hasNext()) {
        j.next();
         // DO STUFF
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM