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 code
    forEach(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());
        }
    }