按子数组的长度对数组进行排序

时间:2014-10-16 06:52:16

标签: java sorting comparator adjacency-list

所以我有一个代表邻接列表的2D数组graph

0:2 1 0
1:0 
2:

以数组格式表示:

[[2,1,0],[0],[]]

我想要做的是按子阵列的长度(边缘列表)对特定行(比如graph[0])进行排序。

在上面的示例中,已排序的graph将如下所示:

0:0 1 2
1:0 
2:

[[0,1,2],[0],[]]

graph[0].length = 3以及graph[1].length = 1graph[2].length = 0

我尝试过使用:

Arrays.sort(graph[v], new DegreeComparator(graph));

class DegreeComparator implements Comparator<Integer> {
  int[][] graph;

  public DegreeComparator(int[][] g) {
    graph = g;
  }

  public int compare(Integer c1, Integer c2) {
    return Integer.compare(graph[c1].length, graph[c2].length);
  }
}

但排序方法不接受这种格式。有人可以解释我做错了吗?

为了清晰起见进行编辑:

因为上面的例子使用了数字,所以有点令人困惑所以我会添加第二个案例:

0: 4 1 2
1: 1 2 3
2: 
3: 4 1
4: 0

[[4,1,2],[1,2,3],[],[4,1],[0]]

将成为(如果所有行都已排序):

0: 1 4 2 // Row 1 has more numbers than row for which has more than row 2
1: 1 3 2
2: 
3: 1 4
4: 0

[[1,4,2],[1,3,2],[],[1,4],[0]]

但是,我只需要一次排序一行!不是全部。

2 个答案:

答案 0 :(得分:1)

您要求使用比较器

对int []进行排序

将图表类型更改为Integer [] []

class DegreeComparator implements Comparator<Integer> {
    Integer[][] graph;

    public DegreeComparator(Integer[][] g) {
        graph = g;
    }

    public int compare(Integer c1, Integer c2) {
        return graph[c2].length - graph[c1].length;
    }
}

答案 1 :(得分:0)

首先只是为了澄清你的问题:你有一个名为graph的数组。你还有一个int数组(我们称之为pointers),它引用了graph的元素。 pointers恰好是graph元素之一的事实并不重要。

    Integer[][] graph = new Integer[4][];
    Integer[] pointers = new Integer[] { 2, 1, 0, 3 };
    graph[0] = pointers;
    graph[1] = new Integer[] { 0 };
    graph[2] = new Integer[] {};
    graph[3] = new Integer[] { 1, 2 };

    System.out.println(Arrays.toString(pointers));
    // [2, 1, 0, 3]

    final int[] lengths = new int[graph.length];
    for (int i = 0; i < graph.length; i++) {
        lengths[i] = graph[i].length;
    }
    Arrays.sort(pointers, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(lengths[o2], lengths[o1]);
        }
    });

    System.out.println(Arrays.toString(pointers));
    // [0, 3, 1, 2]