我想在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
的索引。
答案 0 :(得分:6)
它看起来你想要一个遍历整个映射的迭代器,并且对于每次迭代,你想要另一个迭代器穿过映射的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
}
}
答案 1 :(得分:2)
j = i
你有两个引用相同的迭代器。
如果你想要另一个迭代器,你需要再次调用.iterator()
。
答案 2 :(得分:2)
我想在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;
}
答案 3 :(得分:0)
您使用两个引用i and j
指向相同的迭代器,因此当一个更改对象的状态时,其他引用也将看到更新的状态。
答案 4 :(得分:0)
您需要第一个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
}
}