繁体   English   中英

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

[英]How can I efficiently sort an ArrayList of ArrayLists by a certain value in each ArrayList?

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

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

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

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

有一种有效的方法可以做到这一点吗?

我不会这样做。

一个更好的主意可能是创建一个封装名字,姓氏和状态并具有List的对象。 完成后,使用Comparator很容易。

效率将取决于您的排序算法Big-Oh行为

最好的选择是不要编写自己的分类器。 使用Collections.sort()

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

是的,使用Java8非常容易。 给定列表:

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

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

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

但是@duffymo是正确的,您可能想在域模型上创建适当的抽象。

假设您使用的是字符串数组列表的数组列表:

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

这将创建一个lambda函数,该函数访问第三个元素进行比较。

但是,正如@duffymo所说,您可能应该使用自定义类的数组列表,而不是数组列表的数组列表。 但是,您仍然必须为该类提供一个排序键,并且您将为该类编写一个等效的lambda函数,以便对其进行排序。

编辑:评论复杂性。

另外,@ duffymo,我会根据要排序的字符串类为关键代码选择字符串排序算法。 不同的集合对排序算法的响应不同。 如果您选择非比较算法,例如Burstsort ,Bucket排序和Radix排序(LSD和MSD两种实现),那么利用字符串的结构,复杂度就可以随大小线性变化。 任何默认的通用排序算法都使用比较(例如Python中的timsort),可以证明这种比较花费最少的 O(nlog(n))时间。 但是,nlog(n)的增长还是相当缓慢的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM