当前位置: 首页 > 知识库问答 >
问题:

如何迭代通过一个HashMap与两个迭代器?

邵展
2023-03-14

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

HashMap

我要创建两个迭代器,一个是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的索引。


共有3个答案

吴哲
2023-03-14

我想在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;
}
百里疏珂
2023-03-14
j = i

同一个迭代器有两个引用。

如果需要另一个迭代器,需要调用。迭代器()

端木元青
2023-03-14

看起来你需要一个遍历整个地图的迭代器,对于每个迭代,你需要另一个遍历地图部分的迭代器,从第一个迭代器当前指向的位置开始。java没有办法设置中间开始的迭代器。此外,我认为不能保证迭代器会以特定的顺序通过;因此,如果你尝试创建一个新的迭代器,然后跳过第一个N来达到你想要的点,我不会指望它会起作用。

您可能想要尝试转换Map的集合。数组的条目对象:

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()时,这将给出关于未检查操作的警告,但我不知道如何绕过它。

编辑:按照路易斯·沃瑟曼的建议(谢谢!):

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
    }
}
 类似资料:
  • 我知道如何在一个hashmap上迭代,但我不确定是否可以在一个hashmap上设置两个迭代器? 假设我有以下hashmap: 我想从Hashmap中得到所有值的组合,这样就不会重复对。在这种情况下,4个值- 但是在java中,我们使用迭代器,那么我如何使用迭代器呢?(如果你能找到一种方法来使用集合的索引,那也很好)。 PS:抱歉,我刚从C转到java,所以我需要你的帮助来启动。

  • 问题内容: 我有一个类似于以下内容的JSON字符串: 我对此字符串进行了JSON解析,然后将所有对象转换为HashMaps,并将所有数组转换为HashMap [] s。我的问题是我需要一个递归函数来遍历Java中此JSON结构的所有节点。我怎样才能做到这一点?我在想类似的东西: 问题答案: 假设一个数组只能在内部包含Maps(而不是其他数组): 或者,如果您可以使用3个功能,则可以使其更简单

  • 我有两个双数组: 我的循环结构如下所示: 我要做的是连续获取项目LatArr[0]和LonArr[0]<这样我就可以在lat1中使用LatArr[0],在lon1中使用LonArr[0]。此外,LatArr[1]应位于lat2,LonArr[1]应位于lon2 但此代码获取LatArr[0]。。[1] 。。和LonArr[0]。。[1] 。。两次每个元素打印两次 任何人都请纠正我的错误,我完全不希

  • 问题内容: 编辑:感谢您的所有迅速答复。现在,我看到该作业将无效。从另一个线程,我读到Java中的迭代器比C ++中的迭代器功能强大得多。请问为什么在Java中使用迭代器?只是要替换“ for”循环?谢谢。 一些注意事项: 第二个迭代器应从第一个迭代器之后的位置开始。 我尝试从头开始遍历一个有序列表,然后在列表中找到一些对象,这些对象具有与aItr所指向的属性相似的属性。 我不介意使用两个“ fo

  • 问题内容: 有没有办法遍历Java SparseArray(适用于Android)?我曾经很容易通过索引来获取值。我找不到一个。 问题答案: 似乎我找到了解决方案。我没有正确注意到该功能。 因此,我将使用以下内容:

  • 我有一个HashMap,一个键作为某个类的对象,一个值作为另一个HashMap,它的键是一个字符串,值是一个双倍: 我需要一个循环,将键(对象)和值(HashMaps)添加到这个HashMap,但我不能在循环中创建一个新的HashMap变量作为它的值。本质上,每个MyClass对象都必须具有具有相应Double的Strings。 这可能吗?这有什么意义吗??