yun*_*nyu 5 java arrays sorting list
假设我有一个(以任何方式未排序)数组:
[ 12 64 35 ]
[ 95 89 95 ]
[ 32 54 09 ]
[ 87 56 12 ]
Run Code Online (Sandbox Code Playgroud)
我想对它进行排序,以便第二列按升序排列:
[ 32 54 09 ]
[ 87 56 12 ]
[ 12 64 35 ]
[ 95 89 95 ]
Run Code Online (Sandbox Code Playgroud)
以下是我考虑处理这个问题的方法:
将每个[xyz]值设为一个列表,并将每个xyz值与一个标识符相关联,该标识符的属性是xyz值的y值.然后,对标识符进行排序.(我不确定排序Java数组是否保留该行中的相应值)
使用hashmap执行与上一个相同的操作
但是,上述两种方法显然有些浪费和复杂,因为它们依赖于不需要的外部标识符值,所以有更简单,更快速,更优雅的方法吗?
很抱歉,如果这是一个愚蠢的问题,我对Java排序数组的方式一点也不熟悉.
最简单,最干净的方法是编写一个小型比较器类.这样可以更灵活地控制排序行为; 例如,您可以对第一个元素或数组的任何元素进行排序.
比较器将是这样的:
new Comparator(){
public int compare ( Integer[] obj1, Integer[] obj2)
{
return obj1[1].compareTo(obj2[1]);
}
Run Code Online (Sandbox Code Playgroud)
这是一个单行(如果你将一个匿名类算作一行),使用Arrays.sort()和适当的类型和编码Comparator:
Arrays.sort(grid, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
Run Code Online (Sandbox Code Playgroud)
注意简单的比较表达式o1[1] - o2[1]- 无需拆箱Integer并使用Integer.compareTo().
这是对您的数据的测试:
public static void main(String[] args) {
int[][] grid = new int[][] {
{ 12, 64, 35 },
{ 95, 89, 95 },
{ 32, 54, 9 },
{ 87, 56, 12 }};
Arrays.sort(grid, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
System.out.println(Arrays.deepToString(grid).replace("],", "],\n"));
}
Run Code Online (Sandbox Code Playgroud)
输出:
[[32, 54, 9],
[87, 56, 12],
[12, 64, 35],
[95, 89, 95]]
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,这里它实际上是一行:
Arrays.sort(grid, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}});
Run Code Online (Sandbox Code Playgroud)