java - java comparable上的排序算法问题

标签 java algorithm sorting comparison comparable

我想做一个特定的排序。我正在使用 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/

相关文章:

java - Thymeleaf - 绑定(bind)在片段中不起作用

java - "Maximum Depth of Binary Tree"的递归方法(Java)的时间复杂度是多少?

java - 如何打印序列 1 1,然后是 2 2,3 3,... n ns?

java - 覆盖主页按钮的功能

python - 递归检查模式

android - 如何从android中的数组排序中跳过第0个位置值?

algorithm - 背包的多项式时间逼近

java - 如何以给定的概率传播随机值?

c++ - 多态中的函数对象

java - 对对象集合进行排序