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

时间:2017-09-24 13:34:34

标签: java sorting data-structures

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

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

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

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

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

你会建议什么?

3 个答案:

答案 0 :(得分:1)

创建一个包含整数和字符串的类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

答案 1 :(得分:0)

由于您希望使用 order 存储一系列内容,我建议使用List

List将要存储的类型为IntegerStringPair,其定义如下:

class IntegerStringPair {
    private int integer;
    private String string;

    public int getInteger() {
        return integer;
    }

    public String getString() {
        return string;
    }

    public IntegerStringPair(int integer, String string) {
        this.integer = integer;
        this.string = string;
    }
}

您的列表将按以下方式声明:

List<IntegerStringPair> list = new ArrayList<>();

要对列表进行排序,您可以执行以下操作:

// by integer
list.sort((x, y) -> Integer.compare(x.getInteger(), y.getInteger()));
// by string lexically
list.sort((x, y) -> x.getString().compareTo(y.getString()));

答案 2 :(得分:0)

这确实需要一个本身不是Comparable的数据类,而是使用两个不同的Comparator进行排序。

其余要求取决于您的其他要求 - 修改集合比阅读更常见吗?您打算使用List语义(在集合中有重复的项目)还是将成为Set?根据这些,持有项目的结构可能是List的两个方法,根据两个比较器之一复制和排序列表,到两个TreeSet来保存预先排序的值