我有字符串列表 例如
**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
}
答案 0 :(得分:3)
使用Comparator.comparing
和thenComparing
方法组合比较器条件将更容易理解,从而减少出错的可能性:
list.sort(Comparator.comparing((String str) -> !str.startsWith(query))
.thenComparing(str -> !str.endsWith(query))
.thenComparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
使用!
符号的原因是为了使我们的真相排在虚假之前。
答案 1 :(得分:1)
比较器的问题在于,当两个输入都以query
字符串开头或结尾时,它违反了约束。例如,当o1
和o2
的{{1}}都以name
开始时,您的比较器将同时返回"united"
和-1
o1.compareTo(o2)
不一致,因此会取消排序算法。
在继续操作之前,您需要修改代码以检查o2.compareTo(o1)
和startsWith
的双方:
endsWith
答案 2 :(得分:0)
您需要3个比较器以提高可读性。
找出团结是否在前面,然后按顺序排序。
找出背面是否团结,然后按顺序排序。
如果不包含united或两者具有相同的united优先级,则可以查找订单。 o1.unitedFront && o2.unitedFront或o1.unitedEnd && o2.unitedEnd。
您目前不考虑两个字符串都包含联合的情况,因为您假设如果第一个字符串包含联合,则另一个字符串不包含。