在Java中按y值排序坐标的最简单方法?

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)

以下是我考虑处理这个问题的方法:

  1. 将每个[xyz]值设为一个列表,并将每个xyz值与一个标识符相关联,该标识符的属性是xyz值的y值.然后,对标识符进行排序.(我不确定排序Java数组是否保留该行中的相应值)

  2. 使用hashmap执行与上一个相同的操作

但是,上述两种方法显然有些浪费和复杂,因为它们依赖于不需要的外部标识符值,所以有更简单,更快速,更优雅的方法吗?

很抱歉,如果这是一个愚蠢的问题,我对Java排序数组的方式一点也不熟悉.

Dee*_*pak 8

最简单,最干净的方法是编写一个小型比较器类.这样可以更灵活地控制排序行为; 例如,您可以对第一个元素或数组的任何元素进行排序.

比较器将是这样的:

new Comparator(){

            public int compare ( Integer[] obj1, Integer[] obj2)
            {
                return obj1[1].compareTo(obj2[1]); 
            }
Run Code Online (Sandbox Code Playgroud)


Boh*_*ian 6

这是一个单行(如果你将一个匿名类算作一行),使用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)