Java如何对包含列表的列表进行按照列表索引值排序?

3

我有一个嵌套列表,如下所示(但它有数千个holder列表在一个主列表中)。假设我需要按照其holder.get(2)索引上的值对主列表listEmailData中每个holder列表进行排序。我似乎无法弄清楚如何做到这一点,需要任何建议。

ArrayList listEmailData;

ArrayList holder = new ArrayList();

listEmailData.add(3)
listEmailData.add(323)
listEmailData.add(2342)

listEmailData.add(holder)

编辑:为了澄清,我有一个包含子列表的列表,在这个子列表中,特定的索引包含一个排名值。我需要根据每个子列表中的排名值对主列表进行排序。

第二次编辑:感谢您的帮助,我已经解决了问题,但似乎它首先放置较大的数字,然后是较小的数字,我希望反过来,从大到小排序。

1个回答

6

你应该实现Comparator<T>来比较列表,然后调用

Collections.sort(listEmailData, comparator);

您的比较器需要比较任意两个“子列表” - 例如通过获取特定值进行比较。例如:

public class ListComparator implements Comparator<List<Integer>>
{
    private final int indexToCompare;

    public ListComparator(int indexToCompare)
    {
        this.indexToCompare = indexToCompare;
    }

    public int compare(List<Integer> first, List<Integer> second)
    {
        // TODO: null checking
        Integer firstValue = first.get(indexToCompare);
        Integer secondValue = second.get(indexToCompare);
        return firstValue.compareTo(secondValue);
    }
}

请注意,这里使用了泛型——希望您的真实代码也是如此。

@Rick - 你不需要直接调用 compare() 方法,它会被 Collections.sort(listEmailData, new ListComparator()) 自动处理。 - Nico Huysamen
好的,谢谢。我认为Collections中的C需要大写。我对Java中的集合不太了解,所以一开始被这个名称误导了,我以为它是一个普通的变量对象名。 - Rick
这似乎是按照相反的数字顺序排列,是只有我这样还是实际上就是这样,我需要做一些额外的事情来使它首先放置最小的数字,然后将最大的数字放在最后。 - Rick
@Jon,抱歉我搞反了,我需要它先做最大的,抱歉,因为我已经工作太久了,所以有些事情搞混了 :) - Rick
@Rick:好的,很容易。只需要在比较器中将这一行改为:return secondValue.compareTo(firstValue);。这将反转比较的性质。 - Jon Skeet
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接