2015-10-20 37 views
0

我正在计算文件中的单词,并且将单词和它们各自的计数加载到哈希映射中。我排序的值,并以此来找回我的钥匙:在不使用BiMap的情况下从HashMap中的值中检索密钥的最有效方法

public static String getKey(TObjectIntHashMap<String> hash, int value){ 
    for(String s: hash.keySet()){ 
     if(value == hash.get(s)){ 
      key = s; 
      hash.remove(key); 
      return key; 
    } 
} 

我知道这是一个非常丑陋的方式来做到这一点,但它是我似乎可以得到工作的唯一途径。我完全知道bimaps的存在,但宁愿不使用它。有任何想法吗?

+2

你应该清楚,你问的'TObjectIntHashMap',而不是'java.util.HashMap'在t书名。 –

+1

为什么你不喜欢使用最省时的解决方案?空间限制? –

+0

根据你多久做一次这可能会更好地构建一个反向映射<整数,列表>。这可以在O(N)时间完成。 – Ingo

回答

0

做到这一点的最好方法是使用番石榴集合中的Multiset。这是简单的代码:

//create multiset 
Multiset<String> multiset = HashMultiset.create(); 

//add some strings 
multiset.add("a"); 
multiset.add("a"); 
multiset.add("b"); 

//sort and print 
System.out.println(Multisets.copyHighestCountFirst(multiset).entrySet(); 

更多Multiset,你可以在这里找到:稍微

https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multiset

+0

谢谢!我会更多地阅读那篇文章。看起来这将是非常有用的。 –

+0

'Multimap'有点像'Map ',这意味着你可以检查你添加相同元素到集合的次数。 –

1

更有效的方式来做到这一点是使用一个迭代,因为这避免了做一个单独的关键和值的查找:

public static String getKey(TObjectIntHashMap<String> hash, int value){ 
    TObjectIntIterator<String> iterator = hash.iterator(); 
    while (iterator.hasNext()) { 
     iterator.advance(); 
     if (iterator.value() == value) { 
     key = iterator.key(); 
     iterator.remove(); 
     return key; 
     } 
    } 
} 
+0

谢谢!我会尝试,如果我不能得到bimap去。 –

相关问题