java - 寻找可排序对的数据结构的建议

标签 java sorting data-structures

我正在寻找一种数据结构,我可以存储一对IntegerString
我将能够对其进行两次排序:一次按整数降序排序,一次按词汇顺序排序。

我还希望能够动态添加新的对。

例如:{(13,a)(12,d) (9,a)}

按数字排序:{(13, a) (12, d) (9,a)}

按词汇顺序排序:{(9, a) (13, a) (12, d)}

你有什么建议?

最佳答案

创建一个类Pair它保存一个整数和一个字符串:

public class Pair {
    private Integer num;
    private String text;

    public Pair(Integer num, String text) {
        this.num = num;
        this.text = text;
    }

    public Integer getNum() { return num; }
    public String getText() { return text; }
}

List<Pair> list = new ArrayList<>();
list.add(new Pair(13, "a"));
list.add(new Pair(12, "d"));
list.add(new Pair(9, "a"));

Java 8 在排序时确实支持自定义内联比较器,但在您的情况下,您似乎需要两级排序,首先按数字排序,然后按文本排序(对于其他比较器反之亦然)。在本例中,我们定义两个自定义比较器。第二个排序条件是通过 Comparator#thenComparing() 添加的以链接方式的方法。然后,我们将流转换为实际的排序列表。

Comparator<Pair> c1 = Comparator.comparing(pair -> -pair.num);
c1 = c1.thenComparing(Comparator.comparing(pair -> pair.text));
Stream<Pair> pairStream = list.stream().sorted(c1);

List<Pair> sortedPairs = pairStream.collect(Collectors.toList());

System.out.println("Sorting descending by number:");
for (Pair p : sortedPairs) {
    System.out.println("(" + p.getNum() + ", " + p.getText() + ")");
}

Comparator<Pair> c2 = Comparator.comparing(pair -> pair.text);
c2 = c2.thenComparing(Comparator.comparing(pair -> pair.num));
pairStream = list.stream().sorted(c2);

sortedPairs = pairStream.collect(Collectors.toList());

System.out.println("Sorting ascending by text:");
for (Pair p : sortedPairs) {
    System.out.println("(" + p.getNum() + ", " + p.getText() + ")");
}

输出:

Sorting descending by number:
(13, a)
(12, d)
(9, a)
Sorting ascending by text:
(9, a)
(13, a)
(12, d)

此处演示:

Rextester

关于java - 寻找可排序对的数据结构的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390608/

相关文章:

Java 利用 ArrayList 通过 GUI 将联系人(对象)写入和读取到文件

string - 从 1 到 N 的字典序排序数字中的第 K 个数字

algorithm - 使用快速排序算法对 K 排序数组进行排序的时间复杂度

sql - MySQL "ON DELETE CASCADE"太强大了

c++ - 括号和指针节点

java - 当一个类的同一个实例作为参数传递到另一个类中时,如何引用该类的同一个实例?

Java - 编辑现有的 JSON 文件

sql - SQL 过程中的排序顺序

c++ - 无法完全删除结构填充 - 代码块 : Cygwin

java - 从带有参数的 shellscript 调用 java