如何按值排序Map条目,然后按键排序并将排序的键放入List?

时间:2015-02-25 01:49:35

标签: java sorting dictionary collections comparator

我有HashMap

private Map<String,Integer> matchesWonByTeam= new HashMap<String,Integer>();
  • 我需要通过匹配赢得(值)来订购这些团队,并返回一个带有团队名称的ArrayList。
  • 如果其中任何一支球队获得相同数量的比赛,则需要按字母顺序排列。

使用集合和比较器的最简单和最简单的方法是什么?

4 个答案:

答案 0 :(得分:5)

这里有适合你的Java 8。

    final Comparator<Map.Entry<String, Integer>> byMatchesWon = 
            Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder());
    final Comparator<Map.Entry<String, Integer>> byTeamName = 
            Comparator.comparing(Map.Entry::getKey);

    final List<String> hasToBeReturned = matchesWonByTeam
            .entrySet().stream()
            .sorted(byMatchesWon.thenComparing(byTeamName))
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

注意 - 内联比较器在这里不起作用,编译器将无法推断出正确的实现。

答案 1 :(得分:2)

你可以使用函数式编程这样做:

final Map<String, Integer> map = new HashMap<>();
map.put("test", 1);
map.put("test1", 3);
map.put("test3", 4);
map.put("test2", 75);
map.put("a", 75);
map.put("test100", 100);

final List<String> test = map
        .entrySet()
        .stream()
        .sorted((Entry<String, Integer> o1, Entry<String, Integer> o2) -> {
              return o1.getValue().equals(o2.getValue()) ? 
                          o1.getKey().compareTo(o2.getKey()) 
                              : o1.getValue().compareTo(o2.getValue());
          })
        .map(e -> e.getKey())
        .collect(Collectors.toList());

for(String s : test)
      System.out.println(s); 

此示例将输出

  

test test1 test3 a test2 test100

答案 2 :(得分:0)

返回条目集,创建一个List,然后使用匿名Comparator实现对条目进行排序。

List<Entry<String,Integer>> matchesWonList = new ArrayList<Entry<String,Integer>>(matchesWonByTeam.entrySet());
Collections.sort(matchesWonList , new   Comparator<Entry<String,Integer>>(){
    //implement your comparator here.
});

答案 3 :(得分:0)

这有效:

Map<String,Integer> map = new HashMap<String,Integer>();
/*...fill map...*/

SortedSet<Map.Entry<String, Integer>> sortedSet = new TreeSet<>(new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Entry<String, Integer> e1, Entry<String, Integer> e2) {
        int res = e1.getValue().compareTo(e2.getValue());
        if(res == 0)
            return e1.getKey().compareTo(e2.getKey());
        return res * -1;
    }
});
sortedSet.addAll(map.entrySet());

List<String> list = new ArrayList<>();
for(Map.Entry<String, Integer> e: sortedSet)
    list.add(e.getKey());

这假设您希望订单从最大Integer到最小Integer。如果没有,请在返回* -1时删除res