5

假设我有一个(以任何方式未排序)数组:

[ 12 64 35 ]
[ 95 89 95 ]
[ 32 54 09 ]
[ 87 56 12 ]

我想对其进行排序,以便第二列按升序排列:

[ 32 54 09 ]
[ 87 56 12 ]
[ 12 64 35 ]
[ 95 89 95 ]

以下是我考虑过的处理方法:

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

  2. 使用 hashmap 做和之前一样的事情

但是,上述两种方法显然有些浪费和复杂,因为它们依赖于不需要的外部标识符值,那么有没有更简单、更快、更优雅的方法来做到这一点?

抱歉,如果这是一个愚蠢的问题,我完全不熟悉 Java 对数组进行排序的方式。

4

4 回答 4

8

最简单和最干净的方法是编写一个小的比较器类。这也将使您在控制排序行为方面具有更大的灵活性;例如,您可以对第一个元素或数组的任何元素进行排序。

比较器将类似于:

new Comparator(){

            public int compare ( Integer[] obj1, Integer[] obj2)
            {
                return obj1[1].compareTo(obj2[1]); 
            }
于 2013-01-05T19:11:22.413 回答
6

这是一个单行(如果您将匿名类算作一行),使用Arrays.sort()和适当类型和编码的Comparator

Arrays.sort(grid, new Comparator<int[]>() {
    public int compare(int[] o1, int[] o2) {
        return o1[1] - o2[1];
    }
});

请注意简单的比较表达式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"));
}

输出:

[[32, 54, 9],
 [87, 56, 12],
 [12, 64, 35],
 [95, 89, 95]]



只是为了好玩,这里它实际上是一行:

Arrays.sort(grid, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}});
于 2013-01-05T19:24:50.723 回答
2

使用自定义比较器。

此实现更通用,因为您可以将其用于任何Comparable类型和任何排序索引。如果您还需要T类型本身的自定义比较器,则需要在构造函数中传递它并替换.compareTo()调用。

public class ArrayElementComparator<T implements Comparable<? super T>> implements Comparator<T[]> {

    private final int sortIndex;

    public ArrayElementComparator(int sortIndex) {
        this.sortIndex = sortIndex;
    }

    @Override
    public int compare(T[] left, T[] right) {
        // Optional: null checks and boundary checks
        if (left == null && right == null) {
            return 0;
        }
        if (left == null || left.length <= sortIndex) {
            return 1;
        }
        if (right == null || right.length <= sortIndex) {
            return -1;
        }
        return left[sortIndex].compareTo(right[sortIndex]);
    }

}

用法:

List<Integer[]> list = new List<Integer[]>();
// ... Add records
Collections.sort(list, new ArrayElementComparator<Integer>(1));
于 2013-01-05T19:23:01.247 回答
1

如果这三个值表示 3D 欧几里得空间中的 (x, y, z) 坐标,您可以编写一个类来保存它们。然后使用这些点的列表或数组以及客户比较器按您希望的方式对它们进行排序。

于 2013-01-05T19:15:00.700 回答