[英]how to sort an arraylist that contains string arrays?
List<String[]> allWordList = new ArrayList<>();
我想基于字符串数组中的第一个元素按字母顺序对“ allWordList”列表进行排序。
我有一个包含大小为2的字符串数组的列表。因此,基本上我想通过比较字符串数组的第一个元素对该列表进行排序。
Collection.sort();
不能用于分类...
List<String>
并不是
List<String[]>
需要明确的是,我不想对单个string []元素进行排序。 我想基于字符串数组的第一个元素对整个列表进行排序。
一个简单的自定义比较器应该可以解决问题。
唯一棘手的事情是确保您没有索引到空数组中:
Collections.sort(allWordList, new Comparator<String[]>() {
public int compare(String[] o1, String[] o2) {
if (o1.length == 0) {
return o2.length == 0 ? 0 : -1;
}
if (o2.length == 0) {
return 1;
}
return o2[0].compareTo(o1[0]);
}
});
您可以提供自己的比较器,例如作为lambda表达式:
allWordList.sort((o1, o2) -> o1[0].compareTo(o2[0]));
我会使用@dasblinkenlight的答案的变体,在这里我不认为比较数组长度是正确的行为。
private void sort() {
List<String[]> allWordList = new ArrayList<String[]>();
// fill the list...
Collections.sort(allWordList, new FirstElementComparator());
// and so on...
}
private static class FirstElementComparator implements Comparator<String[]>
{
@Override
public int compare(String[] sa1, String[] sa2) {
String str1 = sa1[0];
String str2 = sa2[0];
int result = 0;
if (str1 == null) {
result = (str2 == null) ? 0 : -1;
}
else {
result = str1.compareTo(str2);
}
return result;
}
}
您不需要编写自己的Comparator
:
allWordList
.stream()
.sorted(Comparator.comparing(a -> a[0], String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList());
如果顺序区分大小写,则可以省略String.CASE_INSENSITIVE_ORDER
。
或者,如果您需要依赖于语言环境的排序,请查看Collator
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.