这是我的Java程序。
import java.util.*;
public class HelloWorld
{
public static void main(String []args)
{
HashMap hm=new HashMap();
hm.put("ansh",1);
hm.put("ansh2",2);
hm.put("ansh3",3);
hm.put("ansh4",1);
hm.put("ansh5",1);
}
}
现在我要检索所有给出值1的键?我们如何在不迭代整个HashMap的情况下做到这一点?
答案 0 :(得分:0)
优雅的解决方案是使用双向地图,例如:http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap或https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/BidiMap.html
答案 1 :(得分:0)
不迭代map
,这是不可能的。我怀疑你宁愿这样做,而不必自己迭代地图。如果你想要一些现成的东西,那就完成了你的任务,你应该考虑使用Guava
库。您可以在此处使用Multimap
。
Multimap<String, Integer> multiMap = ArrayListMultimap.create();
multiMap.put("ansh",1);
multiMap.put("ansh2",2);
multiMap.put("ansh3",3);
multiMap.put("ansh4",1);
multiMap.put("ansh5",1);
这与您创建Map
的方式类似。现在回答你的问题。您需要所有键,特定值1
。在这种情况下,您可以创建此多图的反转。那会给你一个Multimap<Integer, String>
。然后,您可以获得密钥1
:
Multimap<Integer, String> map =
Multimaps.invertFrom(multiMap,
ArrayListMultimap.<Integer, String>create());
System.out.println(map.get(1));
答案 2 :(得分:0)
反向查找地图是Map<Integer,List<String>>
。创建后,查找具有给定int值的所有字符串很容易。
import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
<P>{@code java MapAndReverseMapXmpl}</P>
**/
public class MapAndReverseMapXmpl {
public static void main(String []args) {
HashMap<String,Integer> hmS2I = new HashMap<String,Integer>();
HashMap<Integer,List<String>> hmI2S = new HashMap<Integer,List<String>>();
addItem(hmS2I, hmI2S, "ansh",1);
addItem(hmS2I, hmI2S, "ansh2",2);
addItem(hmS2I, hmI2S, "ansh3",3);
addItem(hmS2I, hmI2S, "ansh4",1);
addItem(hmS2I, hmI2S, "ansh5",1);
System.out.println("string-to-int:");
Set<String> stStrKeys = hmS2I.keySet();
Iterator<String> itrs = stStrKeys.iterator();
while(itrs.hasNext()) {
String s = itrs.next();
System.out.println(s + ": " + hmS2I.get(s));
}
System.out.println();
System.out.println("int-to-string:");
Set<Integer> stIntKeys = hmI2S.keySet();
Iterator<Integer> itri = stIntKeys.iterator();
while(itri.hasNext()) {
Integer I = itri.next();
System.out.println(I + ": " + Arrays.toString(hmI2S.get(I).toArray()));
}
System.out.println();
}
private static final void addItem(HashMap<String,Integer> hm_strToInt, HashMap<Integer,List<String>> hm_intToStr, String s_text, int i_num) {
hm_strToInt.put(s_text, i_num);
if(hm_intToStr.containsKey(i_num)) {
hm_intToStr.get(i_num).add(s_text);
} else {
ArrayList<String> als = new ArrayList<String>(5);
als.add(s_text);
hm_intToStr.put(i_num, als);
}
}
}
输出:
[C:\java_code\]java MapAndReverseMapXmpl
string-to-int:
ansh3: 3
ansh2: 2
ansh5: 1
ansh: 1
ansh4: 1
int-to-string:
1: [ansh, ansh4, ansh5]
2: [ansh2]
3: [ansh3]