Java 如何打印HashMap的内容<;字符串,字符串>;根据其值按升序排列?
我有这个Java 如何打印HashMap的内容<;字符串,字符串>;根据其值按升序排列?,java,sorting,hashmap,Java,Sorting,Hashmap,我有这个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"); 创
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");
TreeMap
HashMap
条目如果这些值是非唯一的,那么您需要在第二个位置有一个列表。您无法仅从HashMap类执行此操作 我将使用
映射代码
,构建一个树映射reversedMap
的反向映射,在该映射中将代码
映射的值映射到键(这将要求原始映射具有从键到值的一对一映射)。由于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());
}
Map reversedMap=newtreemap(代码);
//然后,您只需访问反向地图,无论您喜欢什么。。。
对于(Map.Entry:reversedMap.entrySet()){
System.out.println(entry.getKey()+”,“+entry.getValue());
}
有几个集合库(commons collections、Google collections等)具有类似的双向映射实现。您需要创建一个键列表,根据相应的值对它们进行排序,然后对排序后的键进行迭代
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));
}
最简单的解决方案是使用像TreeMap这样的排序映射,而不是HashMap。 如果您无法控制地图的构造,那么最小的解决方案是构造一组排序的键。你真的不需要一张新地图
Set<String> sortedKeys = new TreeSet<String>();
sortedKeys.addAll(codes.keySet());
for(String key: sortedKeys){
println(key + ":" + codes.get(key));
}
Set sortedKeys=new TreeSet();
sortedKeys.addAll(codes.keySet());
用于(字符串键:sortedKeys){
println(key+:“+codes.get(key));
}
您可以使用条目集列表而不是键集,如果您根据值进行排序,这是一个更自然的选择。这样可以避免在条目的排序和打印过程中进行大量不必要的查找
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());
}
}
Map=。。。
List-listOfEntries=newArrayList(map.entrySet());
sort(条目列表,新的SortByValueComparator());
for(Map.Entry:listOfEntries)
系统输出打印项次(输入);
静态类SortByValueComparator实现Comparator{
公共整数比较(映射项e1、映射项e2){
返回e1.getValue().compatto(e2.getValue());
}
}
for(Map.Entry:codes.entrySet()
)的for循环对我不起作用。使用迭代器代替
Iterator<Map.Entry<String, String>> i = codes.entrySet().iterator();
while(i.hasNext()){
String key = i.next().getKey();
System.out.println(key+", "+codes.get(key));
}
Iterator i=code.entrySet().Iterator();
while(i.hasNext()){
字符串key=i.next().getKey();
System.out.println(key+”,“+code.get(key));
}
试试:
是时候添加一些lambda了:
codes.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(System.out::println);
您只需使用:
Map<>.toString().replace("]","\n");
Map.toString().replace(“]”,“\n”);
并用新行替换每个key=value集合的结束方括号。Java 8
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
我认为最简单最短的代码是:
public void listPrinter(LinkedHashMap<String, String> caseList) {
for(Entry entry:caseList.entrySet()) {
System.out.println("K: \t"+entry.getKey()+", V: \t"+entry.getValue());
}
}
公共作废列表打印机(LinkedHashMap案例列表){
for(条目:caseList.entrySet()){
System.out.println(“K:\t”+entry.getKey()+”,V:\t“+entry.getValue());
}
}
漂亮。不得不删除我的答案:)不太正确。。。“基于红黑树的SortedMap接口实现。该类保证映射将按键的升序排序,根据键的类的自然顺序排序(参见Comparable),或由创建时提供的比较器排序,具体取决于使用的构造函数。”您将按键排序,不是值。可能重复:只是好奇。用例是什么?我猜您选择了一个错误的数据结构,并试图调整它以适应您的规格。为什么需要第二个循环?只需创建一个临时映射并从codes
添加切换键和值?这不是必需的,这是访问reversedMap
并使用entries执行操作的一个示例。如果映射中的两个条目具有不同的键但值相同怎么办?这段代码将删除其中一个…@akb这就是为什么我说这将要求原始映射具有从键到值的一对一映射System.out.println(entry.getValue()+,“+entry.getKey())代码>要复制OP的原始打印输出,OP希望输出按值排序,而不是按键排序。删除此项-不回答问题吗?你可能想阅读。这是不是打算作为一个不同问题的答案发布?如果是,请在此处删除。这是否打算作为其他问题的答案发布?如果是,请在此处删除。这是否打算作为其他问题的答案发布?如果是这样,请在此处删除它。这并不能回答问题,因为您正在迭代未排序的原始HashMap
。这不会打印字符串值,除非我在此处缺少某些内容。@AlmostInnovator codeforEach(System.out::println)
将打印每个条目。我想这只是打印地址,而不是值?我试过了,但没有成功。我的地图包含两个对象,键是一个“person”对象,它有一个firstname、lastname字段等等,我想打印firstname,我不知道这段代码是如何实现的?谢谢您的时间。@Almosta初学者准确地说,这段代码打印地图中的所有条目
,隐式调用它们的toString
方法。如果要打印键或键中的某个字段,可以执行以下操作:code.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).Map(Map.Entry::getKey).Map(Person::getLastName).forEach(System.out::println)代码>感谢Vladimir S.的帮助,尊敬:)
while (itr.hasNext()) {
Vehicle vc=(Vehicle) itr.next();
if(vc.getVehicleType().equalsIgnoreCase(s)) {
count++;
}
}
codes.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(System.out::println);
Map<>.toString().replace("]","\n");
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
public void listPrinter(LinkedHashMap<String, String> caseList) {
for(Entry entry:caseList.entrySet()) {
System.out.println("K: \t"+entry.getKey()+", V: \t"+entry.getValue());
}
}