如何在 Java 中对条目进行排序

How to sort items on entry in Java

假设我们得到了一份字母 B、F、A、G 的列表,它们相互堆叠,我想打印出它们堆叠的顺序。例如,如果我得到的信息是:

A-G / F-B / A-B / A-F / G-B / G-F

其中符号 - 表示“位于”之上(因此 A 位于 G 之上,F 位于 B 之上,A 位于 B 之上...)然后我想输出 A, G , F, B 基于给定的数据。问题是这个列表是逐行读取的,所以在读取第一行之后,预期输出是 A,G,直到读取其他行并更新预期输出。 我的第一直觉是使用堆栈,但随后我需要大量的弹出和推送操作,这会很麻烦,因为最好的数据结构可以让我在字母之间切换位置或自由移动东西,而树似乎是最好的选择但具体如何实施?

我会使用有向图。 JDK中没有有向图类,但是有很多实现它的库(列出here),我个人会看一下jgrapht或者Google的Guava库(不记得是否有有向图)。 这是您数据的有向图的样子:

创建有向图后,确保它没有环(例如,您没有定义 A-B、B-C、C-A,这会创建环) , 然后排序只是用以下逻辑编写比较器的问题:

  • 如果 o1 == o2 return 0;
  • 如果 o1 连接到 o2 return -1;
  • 如果 o1 没有连接到 o2 return 1;

您可以使用这些对来构建比较器,如下所示:

Set<List<String>> pairs = Arrays.stream(order.split(" / "))
        .map(p -> p.split("-"))
        .map(Arrays::asList)
        .collect(Collectors.toSet());

Comparator<String> compare = (a, b) ->
        pairs.contains(Arrays.asList(a, b)) ? -1 :
        pairs.contains(Arrays.asList(b, a)) ? 1 :
        0;

然后使用它以您想要的任何结构对您的输入进行排序。

Ideone Demo