我有这个HashMap
,我需要根据其中包含的 值 按升序打印出来( 不是键 )。
但是我打印出来的顺序似乎是随机的。
以 升序订单 打印出来的最佳方式是什么?
Map<String, String> codes = new HashMap<String, String>();
codes.put("A1", "Aania");
codes.put("X1", "Abatha");
codes.put("C1", "Acathan");
codes.put("S1", "Adreenas");
换句话说,上面的例子应该打印出来:
A1, Aania
X1, Abatha
C1, Acathan
S1, Adreenas
答案 0 :(得分:39)
您无法单独从HashMap类中执行此操作。
我会使用Map<String, String> codes
,构建一个TreeMap<String, String> reversedMap
的反向地图,您可以将codes
地图的值映射到键(这需要您的原始地图有一个从键到值的一对一映射。由于TreeMap提供了按升序键顺序返回条目的迭代器,因此这将为您提供所需顺序中第一个映射的值/键组合(按值排序)。
Map<String, String> reversedMap = new TreeMap<String, String>(codes);
//then you just access the reversedMap however you like...
for (Map.Entry entry : reversedMap.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
有几个集合库(公共集合,Google集合等)具有类似的双向Map实现。
答案 1 :(得分:11)
您需要创建一个键列表,根据相应的值对它们进行排序,然后遍历排序的键。
Map<String, String> map = getMyMap();
List<String> keys = new ArrayList<String>(map.keySet());
Collections.sort(keys, someComparator);
for (String key: keys) {
System.out.println(key + ": " + map.get(key));
}
至于someComparator
的用途,这里有一些方便的,通用的比较器创建例程,我经常觉得它很有用。第一个按照自然顺序对值进行排序,第二个允许您指定任意比较器来对值进行排序:
public static <K, V extends Comparable<? super V>>
Comparator<K> mapValueComparator(final Map<K, V> map) {
return new Comparator<K>() {
public int compare(K key1, K key2) {
return map.get(key1).compareTo(map.get(key2));
}
};
}
public static <K, V>
Comparator<K> mapValueComparator(final Map<K, V> map,
final Comparator<V> comparator) {
return new Comparator<K>() {
public int compare(K key1, K key2) {
return comparator.compare(map.get(key1), map.get(key2));
}
};
}
答案 2 :(得分:6)
是时候添加一些lambdas了:
codes.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(System.out::println);
答案 3 :(得分:5)
For(for.Entry条目:codes.entrySet()
)的for循环对我不起作用。使用Iterator代替。
Iterator<Map.Entry<String, String>> i = codes.entrySet().iterator();
while(i.hasNext()){
String key = i.next().getKey();
System.out.println(key+", "+codes.get(key));
}
答案 4 :(得分:5)
你只需要使用:
Map<>.toString().replace("]","\n");
并用新行替换每个key = value set的结束方括号。
答案 5 :(得分:3)
Java 8
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
答案 6 :(得分:2)
TreeMap<String,String>
HashMap
条目,并将值作为键。如果值不是唯一的,则需要第二个位置的列表。
答案 7 :(得分:1)
您可以使用条目集的列表而不是键集,如果您根据值进行排序,则它是更自然的选择。这样可以避免在分类和打印条目时进行大量不必要的查找。
Map<String, String> map = ...
List<Map.Entry<String, String>> listOfEntries = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(listOfEntries, new SortByValueComparator());
for(Map.Entry<String, String> entry: listOfEntries)
System.out.println(entry);
static class SortByValueComparator implements Comparator<Map.Entry<String, String>> {
public int compareTo(Map.Entry<String, String> e1, Map.Entry<String, String> e2) {
return e1.getValue().compateTo(e2.getValue());
}
}
答案 8 :(得分:0)
我认为最简单,最短的代码是:
public void listPrinter(LinkedHashMap<String, String> caseList) {
for(Entry entry:caseList.entrySet()) {
System.out.println("K: \t"+entry.getKey()+", V: \t"+entry.getValue());
}
}
答案 9 :(得分:-1)
最简单的解决方案是使用像TreeMap这样的有序映射而不是HashMap。 如果您无法控制地图构造,那么最小的解决方案是构造一组有序的键。你真的不需要新的地图。
Set<String> sortedKeys = new TreeSet<String>();
sortedKeys.addAll(codes.keySet());
for(String key: sortedKeys){
println(key + ":" + codes.get(key));
}
答案 10 :(得分:-2)
尝试:
try
{
int cnt= m.getSmartPhoneCount("HTC",true);
System.out.println("total count of HTC="+cnt);
}
catch (NoSuchBrandSmartPhoneAvailableException e)
{
// TODO Auto-generated catch
e.printStackTrace();
}
答案 11 :(得分:-3)
SmartPhone[] sp=new SmartPhone[4];
sp[0]=new SmartPhone(1,"HTC","desire","black",20000,10,true,true);
sp[1]=new SmartPhone(2,"samsung","grand","black",5000,10,false,true);
sp[2]=new SmartPhone(14,"google nexus","desire","black",2000,30,true,false);
sp[3]=new SmartPhone(13,"HTC","desire","white",50000,40,false,false);
答案 12 :(得分:-3)
while (itr.hasNext()) {
Vehicle vc=(Vehicle) itr.next();
if(vc.getVehicleType().equalsIgnoreCase(s)) {
count++;
}
}