如何对列表hashmap进行排序?

时间:2017-01-15 15:55:12

标签: java sorting hashmap

我有以下列表:

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

使用以下代码在我的地图列表中进行一些计算后

map.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue()
    .reversed()).limit(1000).forEach(System.out::println);

它返回一个基于整数和名称排序的列表:

team1=1511
team4=1106
team2=805
team3=792

这意味着team1以时间1211排名第一,team4排名第二,时间为1106,依此类推。

现在,在我的map2中,我希望能够根据驱动程序的时间使用相同的列表,但它应该像这样排序:

team1=1511
team4=1106
team1=1010
team2=905
team2=892
team3=750
team3=740
team4=600

这意味着team1的第一名是1511,然后是team4,时间是1106,然后是team1,时间是1010,依此类推。

(基本上,你有一个团队,每个团队至少有2名司机,经过一些计算,你希望能够看到谁赢得了比赛)

对于map2我使用以下内容进行排序和返回:

 map2.entrySet().stream().sorted(Map.Entry.<String, Map<Integer, Integer>>comparingByKey()
    .reversed()).limit(1000).forEach(System.out::println);

但这不会返回正确的结果。

我想知道是否可以使用hashmap执行此操作,或者甚至使用ArrayList ??

2 个答案:

答案 0 :(得分:0)

另一种方法......为什么不单独上课呢?

public class Standing implements Comparable<Standing> {

    private String team;
    private Integer time;

    public Standing(String team, Integer time) {
        this.team = team;
        this.time = time;
    }

    public String getTeam() {
        return this.team;
    }

    public Integer getTime() {
        return this.time;
    }

    @Override
    public String toString() {
        return this.team + "=" + this.time;
    }

    public int compareTo(Standing standing) {
        return (this.time).compareTo(standing.getTime());
    }
}

我会在这里使用:

Map<String,  ArrayList<Integer>> map2 = new HashMap<String, ArrayList<Integer>();

这样:

TreeSet<Standing> standingSet = new TreeSet<Standing>();
for (String team : map2.keySet()) {
    standingSet.add(new Standing(team, map2.get(team).get(0)));
    standingSet.add(new Standing(team, map2.get(team).get(1)));
}

for (Standing standing : standingSet) {
    System.out.println(standing);
}

答案 1 :(得分:0)

假设map2包含:

team1: {
    1: 1506,
    2: 1010
},
team4: {
    1: 1106,
    2: 600
}

...然后你可以按照以下方式对其进行排序:

List<DriverResult> results = map2.entrySet().stream()
    .flatMap(e -> e.getValue().entrySet().stream()
        .map(e2 -> new DriverResult(e.getKey(), e2.getKey(), e2.getValue()))
    )
    .sorted(Comparator.comparing(DriverResult::getTime))
    .collect(Collectors.toList());

这个助手类:

public class DriverResult {
  private String team;
  private int number;
  private int time;

  public DriverResult(String team, int number, int time) {
    this.team = team;
    this.time = time;
    this.number = number;
  }

  public int getTime() {
    return time;
  }
}