[英]How to sort list of strings where first comes strings with startWith then endWith
我有例如字符串列表
**united**abc
**united**abcd
abcd**united**
**united**abcde
asdasdad**united**
**united**a
它是根据字符串的长度排序的,但是我的想法是像
**united**a
**united**abc
**united**abcd
**united**abcde
abcd**united**
asdasdad**united**
因此首先出现的字符串以united开头,然后其他单词以united结尾。 但我仍然需要保持长度顺序。
我尝试了这个,但这不起作用
if (o1.name.toLowerCase().startsWith(query)) {
return@Comparator -1
} else if (o2.name.toLowerCase().startsWith(query)) {
return@Comparator 1
} else {
return@Comparator 0
}
使用Comparator.comparing
和thenComparing
方法合并比较器条件thenComparing
容易理解,从而减少出错的thenComparing
:
list.sort(Comparator.comparing((String str) -> !str.startsWith(query))
.thenComparing(str -> !str.endsWith(query))
.thenComparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
的原因!
符号是为了使我们的真实会在错误之前排序。
比较器的问题在于,当两个输入都以query
字符串开头或结尾时,它就违反了约束。 例如,当o1
和o2
的name
均以"united"
开头时,您的比较器将同时返回o1.compareTo(o2)
和其相反的o2.compareTo(o1)
-1
,这是不一致的,因此抛出排序算法。
您需要修改代码以检查双方的startsWith
和endsWith
你再继续之前:
String n1 = o1.name.toLowerCase();
String n2 = o2.name.toLowerCase();
// Both startsWith / both endsWith
if ((n1.startsWith(query) && n2.startsWith(query))
|| (n1.endsWith(query) && n2.endsWith(query))) {
return Integer.compare(n1.length(), n2.length());
}
// Only one startsWith
if (n1.startsWith(query)) {
return -1;
}
if (n2.startsWith(query)) {
return 1;
}
// only one endsWith
if (n1.endsWith(query)) {
return 1;
}
if (n2.endsWith(query)) {
return -1;
}
您需要3个比较器以提高可读性。
找出是否团结在一起的人在前面,然后按顺序排列。
找出是否团结在一起的人在后面,然后按顺序排列。
如果不包含united或两者具有相同的united优先级,则可以查找订单。 o1.unitedFront && o2.unitedFront或o1.unitedEnd && o2.unitedEnd。
您目前不考虑两个字符串都包含联合的情况,因为您假设如果第一个字符串包含联合,则另一个字符串不包含联合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.