[英]How to iterate through Nested Map and Multiset? - Java/Guava
我應該如何使用這樣的聲明迭代嵌套映射?
Map<String, Multiset<String>>
請建議是否有其他hashmap / list更有效的方法來執行此哈希填充任務?
import com.google.common.collect.Multiset;
import com.google.common.collect.TreeMultiset;
String[] foobarness = {"foo" , "bar", "ness", "foo",
"bar", "foo", "ness", "bar", "foo", "ness", "foo",
"bar", "foo", "ness", "bar", "ness", "foo", "bar",
"foo", "ness"};
String[] types = {"type::1", "type::2", "type::3",
"type::4",};
Map<String, Multiset<String>> typeTextCount =
new HashMap<String, Multiset<String>>();
Multiset<String> textAndCount
= TreeMultiset.create();
for (int i=0; i<types.length; i++) {
// I know it's kinda weird but in my task,
// i want to keep adding only 1 to the count for each entry.
// Please suggest if there is a better hashmap/list for such task.
if ((types[i]== "type::1") or (types[i]== "type::3")) {
for (String text : foobarness) {
// I don't worry too much about how i
// populate the Map, it is iterating through
// the Map that I have problem with.
textAndCount.put(text, 1);
}
}
if ((types[i]== "type::2") or (types[i]== "type::4")) {
for (String text : foobarness)
textAndCount.put(text, 1);
}
}
所以現在填充了hashmap,我如何遍歷那個復雜的嵌套映射? 我已經嘗試了下面的代碼,但我只從我的Multiset獲得了第一個getValue():
Iterator<Entry<String, Multiset<String>>> itTTC =
typeTextCount.entrySet().iterator();
while (itTTC.hasNext()) {
Map.Entry textCt = (Map.Entry)itTTC.next();
System.out.println(textCt.getKey() + " :\t" + textCt.getValue());
itTTC.remove();
}
在您的代碼中,您不會將Multiset
添加到Map
。 這就是為什么你沒有看到任何輸出。
在你的代碼中我做了這個:
typeTextCount.put(types[i], textAndCount);
在循環內部,然后使用相同的迭代器,我可以看到所有輸出,如下所示:
type::3 : [bar x 24, foo x 32, ness x 24]
type::2 : [bar x 24, foo x 32, ness x 24]
type::4 : [bar x 24, foo x 32, ness x 24]
type::1 : [bar x 24, foo x 32, ness x 24]
編輯:完整的代碼供參考:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Multiset;
import com.google.common.collect.TreeMultiset;
public class TestIterator {
private static String[] foobarness =
{
"foo", "bar", "ness", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "foo", "bar", "foo", "ness",
"bar", "ness", "foo", "bar", "foo", "ness"
};
private static String[] types =
{
"type::1", "type::2", "type::3", "type::4",
};
public static void main(String[] args) {
Map<String, Multiset<String>> typeTextCount = new HashMap<String, Multiset<String>>();
Multiset<String> textAndCount = TreeMultiset.create();
for (int i = 0; i < types.length; i++) {
// I know it's kinda weird but in my task,
// I want to keep adding only 1 to the count for each entry.
// Please suggest if there is a better hashmap/list for such task.
if (("type::1".equals(types[i])) || ("type::3".equals(types[i]))) {
for (String text : foobarness) {
// I don't worry too much about how i
// populate the Map, it is iterating through
// the Map that I have problem with.
textAndCount.add(text, 1);
}
}
if (("type::2".equals(types[i])) || ("type::4".equals(types[i]))) {
for (String text : foobarness)
textAndCount.add(text, 1);
}
typeTextCount.put(types[i], textAndCount);
}
Iterator<Entry<String, Multiset<String>>> itTTC = typeTextCount.entrySet().iterator();
while (itTTC.hasNext()) {
Map.Entry textCt = (Map.Entry) itTTC.next();
System.out.println(textCt.getKey() + " :\t" + textCt.getValue());
itTTC.remove();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.