如何在每个ArrayList中按特定值有效地对ArrayLists的ArrayList进行排序?

时间:2016-10-04 23:57:17

标签: java sorting arraylist

我有一个ArrayList用于保存以下形式的ArrayLists ...

[sally, carp, md]
[jim, smith, ny]
[frank, franklin, ca]

我希望通过内部ArrayList中的第三个参数(state)对外部ArrayList进行排序。排序的结果如下......

[frank, franklin, ca]
[sally, carp, md]
[jim, smith, ny]

有一种有效的方法吗?

3 个答案:

答案 0 :(得分:4)

我不会这样做。

更好的想法可能是创建一个封装名字,姓氏和状态的对象,并拥有List个。一旦你这样做,Comparator就很容易了。

效率将受Big-Oh behavior of your sorting algorithm

的约束

最好的办法是不要自己编写分拣机。使用Collections.sort()

https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

答案 1 :(得分:2)

是的,使用Java8非常容易。鉴于清单:

List<List<String>> list; //let's assume it's initialized

您可以使用内容列表的第三个元素对外部列表进行排序:

list.sort(Comparator.comparing(l -> l.get(2)));

但是@duffymo是对的,你可能想在你的域模型上创建一个合适的抽象。

答案 2 :(得分:1)

假设你正在使用字符串arraylists的arraylist:

arrayList.sort((al1, al2) -> al1[2].compareTo(al2[2]));

这将创建一个lambda函数,用于访问要比较的第三个元素。

然而,正如@duffymo所说,你应该使用自定义类的arraylist而不是arraylists的arraylist。但是,您仍然需要为该类提供排序键,并且您要为您的类编写一个有效等效的lambda函数,以便对其进行排序。

编辑:评论复杂性。

另外,@ duffymo,我会根据我正在排序的字符串类为关键代码选择字符串排序算法。不同的集合对排序算法的响应不同。如果您选择非比较算法,例如Burstsort,Bucket sort和Radix sort(LSD和MSD实现),则通过利用字符串结构,您的复杂性可以与大小成线性关系。任何默认的通用排序算法都使用比较(例如Python中的timsort),可以证明它在最小 O(nlog(n))时间。不过,nlog(n)增长速度相当慢。