如何在 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;
然后使用它以您想要的任何结构对您的输入进行排序。
假设我们得到了一份字母 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;
然后使用它以您想要的任何结构对您的输入进行排序。