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

Java 如何按照每个ArrayList中的某个值对ArrayList中的ArrayList进行有效排序?,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个ArrayList用于保存以下形式的ArrayList [sally, carp, md] [jim, smith, ny] [frank, franklin, ca] 我希望通过内部ArrayList中的第三个参数(状态)对外部ArrayList进行排序。排序结果如下 [frank, franklin, ca] [sally, carp, md] [jim, smith, ny] 有没有一种有效的方法可以做到这一点?我不会这么做 更好的方法可能是创建一个对象,该对象封装了名字、姓氏

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

[sally, carp, md]
[jim, smith, ny]
[frank, franklin, ca]
我希望通过内部ArrayList中的第三个参数(状态)对外部ArrayList进行排序。排序结果如下

[frank, franklin, ca]
[sally, carp, md]
[jim, smith, ny]
有没有一种有效的方法可以做到这一点?

我不会这么做

更好的方法可能是创建一个对象,该对象封装了名字、姓氏和状态,并有一个
列表
。一旦这样做,使用
比较器就很容易了

效率将由市场决定

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


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

arrayList.sort((al1, al2) -> al1[2].compareTo(al2[2]));
这将创建一个lambda函数,该函数访问第三个元素进行比较

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

编辑:评论复杂性


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

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

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

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

我喜欢在其他两个答案中使用lambdas。做得好。因为我从来不会对超过10个对象进行排序,所以我选择了这个方法,它非常有效。非常感谢。
list.sort(Comparator.comparing(l -> l.get(2)));