如何排序字符串列表,其中先出现的字符串是startWith,然后是endWith

时间:2018-09-07 15:58:21

标签: java sorting collections

我有字符串列表 例如

**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
  }

3 个答案:

答案 0 :(得分:3)

使用Comparator.comparingthenComparing方法组合比较器条件将更容易理解,从而减少出错的可能性:

list.sort(Comparator.comparing((String str) -> !str.startsWith(query))
        .thenComparing(str -> !str.endsWith(query))
        .thenComparingInt(String::length)
        .thenComparing(Comparator.naturalOrder()));

使用!符号的原因是为了使我们的真相排在虚假之前。

答案 1 :(得分:1)

比较器的问题在于,当两个输入都以query字符串开头或结尾时,它违反了约束。例如,当o1o2的{​​{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。

您目前不考虑两个字符串都包含联合的情况,因为您假设如果第一个字符串包含联合,则另一个字符串不包含。