【问题标题】:Sort by multiple columns, Java 8按多列排序,Java 8
【发布时间】:2015-08-25 12:55:22
【问题描述】:

考虑下表:

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

我有三列,它应该首先按“名称”列排序,然后按“编号”列排序。我想用 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 中的解决方案。

【问题讨论】:

  • 您为什么不尝试使用 Set 并为您的项目应用适当的 Comparable?

标签: java java-8


【解决方案1】:

首先,你应该让表格的每一行都成为一个对象:

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&lt;Double, String[]&gt; 并不代表您要达到的目标。 Map 用于在唯一键和 a 值之间创建链接。每个数字与名称和代码相关联是否有意义?

一旦你有了这个对象,就更容易根据它的属性对其进行排序:

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());

【讨论】:

  • 很好,非常感谢。实际上,最好将对象用于每个项目。我真的没有超越这个想法......非常感谢!
【解决方案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])

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

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2018-04-29
    • 2014-12-21
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多