2011-12-15 36 views
0

通过引用放置HashMap并通过复制放置hashmaps。我如何做后者? 另一个问题是String[] types的数量不是真正的预知,因此创建Multiset<String> textAndCount = TreeMultiset.create();的多个实例并不是很有帮助。 我有下面的代码,但两种类型的输出都是一样的。HashMap put或putAll? - Java

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[] foobarness2 = {"bar", "ness", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "foo", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "bar", "foo", "ness", "ness", "bar", "foo", "ness"}; 

private static String[] types = {"type::1", "type::2"}; 


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++) { 
     if ("type::1".equals(types[i])) { 
      for (String text : foobarness) 
       textAndCount.add(text, 1); 
     } 
     if ("type::2".equals(types[i])) { 
      for (String text : foobarness2) 
       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(); 
    } 
} 

我的输出是从上面的代码:

type::2 : [bar x 13, foo x 17, ness x 14] 
type::1 : [bar x 13, foo x 17, ness x 14] 

正确的输出应该是:

type::1 : [bar x 6, foo x 8, ness x 6] 
type::2 : [bar x 7, foo x 9, ness x 8] 

回答

4

移动Multiset<String> textAndCount = TreeMultiset.create()您的for循环中。这两个“类型”共享同一个multiset,因此您的计数加倍。

您的循环,然后可能是这样的:

for (int i = 0; i < types.length; i++) { 
     Multiset<String> textAndCount = TreeMultiset.create(); 
     if ("type::1".equals(types[i])) { 
      for (String text : foobarness) 
       textAndCount.add(text, 1); 
     } 
     if ("type::2".equals(types[i])) { 
      for (String text : foobarness2) 
       textAndCount.add(text, 1); 
     } 
     typeTextCount.put(types[i], textAndCount); 
    } 

当你在这,你可以通过使用换每种款式循环改善你的地图上的迭代为好。如果您在迭代时想要删除每个条目,则可以将您的entrySet包装在consumingIterable中以获得相同的功能。

for (Entry<String, Multiset<String>> textCt : Iterables.consumingIterable(typeTextCount 
      .entrySet())) { 
     System.out.println(textCt.getKey() + " :\t" + textCt.getValue()); 
    } 

这样产生的输出:

type::2 : [bar x 7, foo x 9, ness x 8] 
type::1 : [bar x 6, foo x 8, ness x 6] 

如果你不喜欢这样的顺序,我建议使用Ordering,让您的条目排序列表。

0

Multiset<String> textAndCount = TreeMultiset.create();应该在循环内部。如果你把一组的副本输出将是

 
type::1 : [bar x 6, foo x 8, ness x 6] 
type::2 : [bar x 13, foo x 17, ness x 14]