我想做一个特定的排序。我正在使用 java 的可比接口(interface),这意味着我的比较方法的返回值必须返回 -1 +1 或 0,具体取决于所比较的两者是否相等,然后我使用 Collections 进行排序。我的麻烦来自于我希望如何比较。
我有一个由以下任一组成的 key
[keyName]
[siteName].[keyName]
[siteName].[pageName].[keyName]
例如“mysite.alampshade.color”
棘手的部分是必须首先对网站进行排序,然后是关键字名称,然后是页面名称。但首先是键名,然后是站点名称,按照属性部分的数量顺序排列。对不起。它有点复杂,一个例子可能会有所帮助。这是它们必须的顺序:
alpha
beta
charlie
sitea.alpha
sitea.charlie
sitea.pagea.beta
sitea.pageb.beta
sitea.pagea.charlie
siteb.alpha
siteb.delta
siteb.pagef.alpha
siteb.pageb.echo
siteb.pageb.golf
siteb.pagea.hotel
siteb.pageb.hotel
siteb.pagec.hotel
我尝试了很多不同的方法,也丢过几次代码,但仍然无法做到完美。如果不是一些 java,一些伪代码会有很大帮助。
编辑: 添加另一个可能更容易理解的示例 以下是我需要的排序方式
a
b
c
z
a.b
a.c
a.d
a.z
a.b.a
a.c.a
a.b.b
a.b.c
a.c.c
a.a.d
b.a
b.b
b.z
b.a.a
b.b.a
b.a.b
c.c.f
最佳答案
另一个选项,如果有更多的条目,可以递归地避免这个问题。
导入java.util.ArrayList; 导入 java.util.Arrays; 导入 java.util.Comparator; 导入 java.util.List;
public class SortTest {
public static void main(String[] args) {
String[] test = new String[]{
"a",
"b",
"b.a",
"b.a.a",
"a.a.a",
"a.b.a",
"a.a",
"a.b",
"b.a.b",
"b.b.a"
};
Arrays.sort(test, new Comparator<String>() {
int compareComplexList(List<String> a, List<String> b, List<int[]> positions, int order ) {
int minimum = a.size() < b.size() ? a.size() - 1 : b.size() - 1;
if (a.get(positions.get(minimum)[order]).compareTo(b.get(positions.get(minimum)[order])) != 0)
return a.get(positions.get(minimum)[order]).compareTo(b.get(positions.get(minimum)[order]));
else if (order < minimum - 1) return compareComplexList(a,b, positions, ++order);
else return Double.compare(a.size(),b.size());
}
public int compare(String a, String b) {
List<String> partsA = Arrays.asList(a.split("\\."));
List<String> partsB = Arrays.asList(b.split("\\."));
List<int[]> orders = new ArrayList<int[]>();
orders.add(new int[] {0});
orders.add(new int[] {0,1});
orders.add(new int[] {0,2,1});
return compareComplexList(partsA, partsB, orders,0);
}
});
System.out.println("Sorted: "+Arrays.toString(test));
}
}
关于java - java comparable上的排序算法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549755/