【问题标题】:Sort an ArrayList of integer arrays对整数数组的 ArrayList 进行排序
【发布时间】:2013-10-25 18:24:20
【问题描述】:

如何根据整数数组中的最后一个整数对整数数组的 ArrayList 进行排序?

ArrayList<int[]> paths = new ArrayList<int[]>();
paths.add(new int[]{0,0,0,0,4});
paths.add(new int[]{0,0,0,0,2});
paths.add(new int[]{0,0,0,0,1});
paths.add(new int[]{0,0,0,0,3});

生成的 ArrayList 将包含: [0,0,0,1] [0,0,0,2] [0,0,0,3] [0,0,0,4]

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    实现Comparator 并使用Collections.sort。或者同时做两个:

    Collections.sort(paths, new Comparator<int[]>() {
        public int compare(int[] a, int[] b) {
            return (Integer)(a[a.length-1]).compareTo(b[b.length-1]);
        }
    });
    

    【讨论】:

    • 我得到这个:无法在原始类型 int 上调用 compareTo(int)
    • 试试return a[a.length-1] -b[b.length-1];return Integer.valueOf(a[a.length-1]).compareTo(Integer.valueOf(b[b.length-1]));
    • 谢谢大家,效果很好
    【解决方案2】:

    这是一个带有不进行自动装箱或强制转换的比较器的版本:

    public class Sorter {
    
        public static void main(String[] args) {
            ArrayList<int[]> paths = new ArrayList<int[]>();
            paths.add(new int[] { 0, 0, 0, 0, 4 });
            paths.add(new int[] { 0, 0, 0, 0, 2 });
            paths.add(new int[] { 0, 0, 0, 0, 1 });
            paths.add(new int[] { 0, 0, 0, 0, 3 });
            Collections.sort(paths, new Comparator<int[]>() {
                private static final int INDEX = 4;
                @Override
                public int compare(int[] o1, int[] o2) {
                    return Integer.compare(o1[INDEX], o2[INDEX]);
                }
            });
            for (int[] is : paths) {
                System.out.println(Arrays.toString(is));
            }
        }
    }
    

    将导致:

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

    【讨论】:

    • 你拯救了我的一天!完美运行。与我的情况相同。谢谢
    【解决方案3】:

    使用 Java-8

    paths.sort(Comparator.comparingInt(a -> a[a.length - 1]));
    

    【讨论】:

      【解决方案4】:

      查看java.util.Collections.sort(List list, Comparator c)...您只需编写一个Comparator 来比较您的两个数组,剩下的就是小菜一碟了。

      【讨论】:

        【解决方案5】:

        首先在您的代码中应该是paths.add(...) 而不是path.add(...)

        如果你不想实现Comparator,你总是可以自己写一个方法。如果效率不重要,这可以工作(冒泡排序 - 显然使用更好的排序算法可能会更好):

        public ArrayList<int[]> sort() {
            ArrayList<int[]> sortedArray = this;
            boolean switched = true;
            while(switched) {
                switched = false;
                for(int i=0; i<sortedArray.size()-1; i++)
                    int[] a = sortedArray.get(i);
                    int[] b = sortedArray.get(i+1);
                    if(a[a.length]>b[b.length]) {
                        sortedArray.set(i, b);
                        sortedArray.set(i+1, a);
                        switched = true;
                    }
            }
            return sortedArray;
        }
        

        这会遍历 ArrayList 并检查每对连续数组的最后一个元素的顺序是否正确。如果是,它检查下一对;如果没有,它会将两个数组切换到 ArrayList 中。它继续遍历 ArrayList 直到它不再需要进行切换;至此 ArrayList 已经排好序了。

        【讨论】:

        • ArrayList&lt;int[]&gt; sortedArray = this -- 你希望它做什么?
        • 你是在建议我将其设为 void 方法吗?
        猜你喜欢
        • 2015-10-06
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多