按多列排序,Java 8

时间:2015-08-25 12:55:22

标签: java java-8

考虑下表:

Name Code Number
Mike x6   5.0
Mike b4   3.0
Mike y2   1.0
Tom  y2   4.5
Tom  x6   4.5
Tom  b4   1.0
Susi x6   4.0
Susi y2   3.0
Susi b4   2.0

我有三列,首先应按列排序"名称"然后由列" Number"。我想用Dictionary做这个(使用String数组作为值,使用Double作为键),然后按值排序,但我错过了按名称排序。

Map<Double, String[]> map = new HashMap<Double, String[]>();
map.put(5.0, {"Mike", "x6"});
System.out.println(map.get(5.0));

我不知道存储数据的最佳方式是什么。我还想知道Java 8中的解决方案。

2 个答案:

答案 0 :(得分:6)

首先,您应该将表格的每一行都作为对象:

public class MyData {

    private String name;
    private String code;
    private Double number;

    public MyData(String name, String code, Double number) {
        this.name = name;
        this.code = code;
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }

    public Double getNumber() {
        return number;
    }

}

使用Map<Double, String[]>并不代表您要实现的目标。 Map用于在唯一键和值之间创建链接。将每个数字与名称和代码相关联是否有意义?

拥有此对象后,根据其属性对其进行排序要容易得多:

List<MyData> list = new ArrayList<>();
list.add(new MyData("Mike", "x6", 5.0));
list.add(new MyData("Mike", "b4 ", 3.0));
list.add(new MyData("Mike", "y2", 1.0));
list.add(new MyData("Tom", "y2", 4.5));
List<MyData> sortedList = list.stream()
                              .sorted(Comparator.comparing(MyData::getName).thenComparing(MyData::getNumber))
                              .collect(Collectors.toList());

答案 1 :(得分:2)

我认为Map对于您的案例来说是错误的数据结构,因为Maps明确地不根据值定义订单。

但是你可以用溪流来帮助自己。类似的东西:

map.entrySet().stream().sorted((e1, e2) -> e1.getValue()[0].compareTo(e2.getValue()[0])).map(e -> e.getKey()).toArray(l -> new Integer[l])

这将为您提供一组键,按值数组中的第一个整数排序。然后,您可以在原始地图中查找完整的值。