所以我有一个代表邻接列表的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 = 1
和graph[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]]
但是,我只需要一次排序一行!不是全部。
答案 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]