在 java 中对 ArrayList<Integer> 的数组进行排序

Posted

技术标签:

【中文标题】在 java 中对 ArrayList<Integer> 的数组进行排序【英文标题】:Sort an Array of ArrayList<Integer> in java 【发布时间】:2015-07-05 13:47:41 【问题描述】:

我想按 ArrayLists 元素的第一个 int 对 ArrayList 数组进行排序。 我试图覆盖 Comparator 类的比较方法,但它抛出:

Exception in thread "main" java.lang.NullPointerException
at BikeGA$1.compare(BikeGA.java:515)
at BikeGA$1.compare(BikeGA.java:1)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:351)
at java.util.TimSort.sort(TimSort.java:230)
at java.util.Arrays.sort(Arrays.java:1438)
at BikeGA.main(BikeGA.java:512)

代码是:

int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];

Arrays.sort(population, new Comparator<ArrayList<Integer>>()
        @Override
        public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2)
            return entry1.get(0).compareTo(entry2.get(0));
        
    );

有人可以帮助我吗? 谢谢。

【问题讨论】:

请发布堆栈跟踪。 你有没有初始化数组中所有的ArrayList,并且每个都至少添加了一个元素? 听起来“entry1”和/或“entry2”有时为空 你确定population中的所有ArrayLists都被初始化了吗? 是的,我已经在排序之前打印了数组并且它已经正确初始化了。 【参考方案1】:

您的 Comparator 应该处理 null 或空 ArrayLists 以便它可以处理您放入数组中的任何数据:

    @Override
    public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2)
        if (entry1 == null && entry2 == null)
            return 0;
        if (entry1 == null)
            return 1;
        if (entry2 == null)
            return -1;
        if (entry1.isEmpty() && entry2.isEmpty())
            return 0;
        if (entry1.isEmpty())
            return 1;
        if (entry2.isEmpty())
            return -1;
        return entry1.get(0).compareTo(entry2.get(0));
    

这会将空元素放在数组的末尾,将空列表放在它们之前。

【讨论】:

mmh 不喜欢这样一个事实,即两个空元素将根据第一个参数中的哪个元素以不同的顺序排序。如果两者都为 null 或为空,则应返回 0【参考方案2】:

您正在比较 2 个数组,但您不检查比较对象是否存在...

int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];

Arrays.sort(population, new Comparator<ArrayList<Integer>>()
        @Override
        public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2)
            Integer value1 = entry1.get(0) == null : -1 ? entry1.get(0);
            Integer value2 = entry2.get(0) == null : -1 ? entry2.get(0);

            return value1.compareTo(value2);
        
    );

【讨论】:

【参考方案3】:

在我的例子中,对象是:

public class Edge 
    private Integer weight;
    public Edge(Integer weight) 
        this.weight = weight;
    
    public Integer getWeight() 
        return weight;
    

我从其他类调用 sort for (List edges = new ArrayList();):

Collections.sort(edges,(edge1,edge2) -> edge1.getWeight().compareTo(edge2.getWeight()));

结果如下: Exception img

解决方案是初始化对象的值:

public class Edge 
    private Integer weight = 0;
    public Edge(Integer weight) 
        this.weight = weight;
    
    public Integer getWeight() 
        return weight;
    

它工作! code 0

【讨论】:

以上是关于在 java 中对 ArrayList<Integer> 的数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中对ArrayList进行排序[重复]

如何在Java中对HashMap进行排序[重复]

Java中数组的ArrayList排序

ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException

如何按降序对 ArrayList<Long> 进行排序?

如何在java中的ArrayList中扫描多个单词