如何有效地对数组列表的数组列表按每个数组列表中的特定值排序?



我有一个数组列表用来保存以下形式的数组列表…

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

我希望根据内部数组列表中的第三个参数(state)对外部数组列表进行排序。排序的结果将如下所示…

[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 sort和Radix sort (LSD和MSD实现),那么通过利用字符串的结构,复杂度可以与大小成线性关系。任何默认的通用排序算法都使用比较(例如Python中的timsort),这可以证明在上花费至少O(nlog(n))时间。尽管如此,nlog(n)的增长速度还是相当缓慢的。

最新更新