【问题标题】:Sorting LinkedHashMap排序 LinkedHashMap
【发布时间】:2012-08-24 10:38:56
【问题描述】:

鉴于 LinkedHashMap 包含字符串和整数,我如何根据其值对 LinkedHashMap 进行排序。所以我需要根据整数值对其进行排序。 非常感谢

【问题讨论】:

标签: java linkedhashmap


【解决方案1】:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.SortedMap;
import java.util.TreeMap;

public class HashMapTest {

public static void main(String[] args) {

    Map<String, Integer> map=new LinkedHashMap<String, Integer>();

    map.put("a", 11);
    map.put("B", 12);
    map.put("c", 3);
    map.put("d", 4);
    map.put("e", 5);
    map.put("f", 6);
    map.put("g", 7);
    map.put("h", 8);
    map.put("i", 9);
    map.put("j", 3);
    map.put("k", 2);
    map.put("l", 1);

    List<Map.Entry<String, Integer>> entries = new 
    ArrayList<Map.Entry<String, Integer>>(map.entrySet());
            Collections.sort(entries,new CustomizedHashMap());


            Map<String, Integer> sortedMap = new LinkedHashMap<String, 
   Integer>();
            for (Map.Entry<String, Integer> entry : entries) {
              sortedMap.put(entry.getKey(), entry.getValue());
              System.out.print( sortedMap.put(entry.getKey(), 
          entry.getValue())+"  ");
            }
     }
    }

 class CustomizedHashMap implements Comparator<Map.Entry<String, Integer>> {

  @Override
  public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
    // TODO Auto-generated method stub
    return -o1.getValue().compareTo(o2.getValue());
  }

}

【讨论】:

    【解决方案2】:

    现在使用 Java 8 流更容易了:您不需要中间映射来排序:

    map.entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .forEach(entry -> ... );
    

    【讨论】:

    • 这三个点是什么?
    • 这三个点代表你想对排序后的值做什么。可能是调用另一种方法,打印它们,将它们收集到不同的地图中 - 无论您的问题需要什么。
    • 为什么这个答案被接受并且评价如此之高?它没有回答如何对地图本身进行排序。它只是告诉如何按特定顺序处理地图的内容。
    • @Guardian667 地图本身无法就地排序。尽管有些地图保证了它们的顺序,但这在接口的文档中是非常清楚的。我怀疑 OP 和支持者意识到了这一点,并理解“根据其值对地图进行排序”意味着按其值的顺序使用条目。对这个问题的其他解释没有任何意义。
    • 这是一个有效的建议。谢谢
    【解决方案3】:
    List<Map.Entry<String, Integer>> entries =
      new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
    Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
      public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){
        return a.getValue().compareTo(b.getValue());
      }
    });
    Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> entry : entries) {
      sortedMap.put(entry.getKey(), entry.getValue());
    }
    

    【讨论】:

    • 好吧,该死的,我正在编写完全相同的代码! :) 除了最后一部分,我认为 OP 实际上不需要将它们放回地图中。
    • 不错的答案。我必须按降序排序,所以在从比较器返回值时添加了一个 -ve 符号。
    • 喜欢切换参数的顺序;如果原始 compareTo 返回 Integer.MIN_VALUE,否定并不总是有效。
    • 即写成b.getValue().compareTo(a.getValue())。
    • 您不需要更改比较器。可以使用Collections.reverseOrder(comparator),意思更明显。
    【解决方案4】:

    LinkedHashMap 只是维护插入顺序。如果要按值排序,可能需要自己写comparator

    【讨论】:

    • 太棒了,是的,非常感谢,我确实编写了自己的比较器
    • 我认为您不需要编写自己的比较器。 Map.Entry.comparingByValue() 应该为您生成一个。并且可以通过Collections.reverseOrder(Map.Entry.comparingByValue())反转。
    • @sprinter: 如果值是任何自定义对象的类型怎么办?
    • @Nambari 要么让该类型实现 Comparable,要么提供客户 ComparatorMap.Entry.comparingByValue
    • 您将如何使用该比较器?您是否提供了与其他人不同的解决方案
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2012-03-24
    • 2016-03-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多