繁体   English   中英

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

[英]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.comparingthenComparing方法合并比较器条件thenComparing容易理解,从而减少出错的thenComparing

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

的原因! 符号是为了使我们的真实会在错误之前排序。

比较器的问题在于,当两个输入都以query字符串开头或结尾时,它就违反了约束。 例如,当o1o2name均以"united"开头时,您的比较器将同时返回o1.compareTo(o2)和其相反的o2.compareTo(o1) -1 ,这是不一致的,因此抛出排序算法。

您需要修改代码以检查双方的startsWithendsWith你再继续之前:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM