3 回答
TA贡献1951条经验 获得超3个赞
您可以使用该Boolean.compare
方法检查字符串是否以“Bob”开头:
Comparator<String> bobsFirst = (a, b) -> Boolean.compare(b.startsWith("Bob"), a.startsWith("Bob"));
以这种方式比较它们(先 b,然后 a),首先以“Bob”开头。
然后,使用自然顺序进行平局:
Comparator<String> comparator = bobsFirst.thenComparing(a -> a);
请注意,startsWith
区分大小写。要忽略“Bob”的大小写,您可以将b.startsWith("Bob")
(与 类似a
)替换为:
b.regionMatches(true, 0, "Bob", 0, 3)
TA贡献1847条经验 获得超11个赞
Collator
班级
用于比较和排序自然语言(人类语言)的规则正式称为排序规则。
在Java中,任何排序规则都是在类实现Collator
类中定义的。通常,它的子类RulesBasedCollator
用于比较/排序。该类CollatorProvider
是一个SPI(服务提供者接口),用于提供注册的Collator
实现。最近版本的 Java 默认使用Unicode Consortium在其公共区域设置数据存储库 (CLDR)中提供的排序规则定义。
Collator
据推测,您可以根据自己的需要自由地构建自己的实现,并使用此类特殊规则。
请注意,校对是一个非常复杂的领域,其规则因人类语言和文化规范而异。如果您只关心美式英语,那么您可能不会遇到什么问题。但如果您处理其他语言、文化或替代字符(例如©
或 表情符号),那么,这里就是龙。
TA贡献2080条经验 获得超4个赞
您需要做的第一件事是了解规则,例如,当出现以下情况时会发生什么:
左边和右边都以“Bob”开头?
当左侧和右侧都不以“Bob”开头时会发生什么?
您关心匹配案例吗?
您只关心名字还是应该包含姓氏或者您希望它是可配置的?
一个简单的实现可能看起来像......
public class NameComparator implements Comparator<String> {
private String name;
public NameComparator(String name) {
this.name = name;
}
@Override
public int compare(String lhs, String rhs) {
if (lhs.startsWith(name) && rhs.startsWith(name)) {
return lhs.compareTo(rhs);
} else if (lhs.startsWith(name)) {
return -1;
} else if (lhs.startsWith(name)) {
return 1;
}
return lhs.compareTo(rhs);
}
}
现在,这会进行大小写匹配(因此bob与 不同Bob),并将对自己组内的所有“Bobs”进行子排序
正如您所看到的,五秒钟的思考已经提出了许多可能的方法来对列表进行排序,因此您需要了解您的选项,您可能希望自定义哪些选项以及您想要修复哪些选项。
您可以使用类似...的方式调用此示例
Collections.sort(list, new NameComparator("Bob"));
这将根据您可用的输入、输出...
Before sort [Bob Stone, Jordan Brand, Bob Mass, Dylan Walsh, Tom Mavis, Bob Ganley]
After sort [Bob Ganley, Bob Mass, Bob Stone, Dylan Walsh, Jordan Brand, Tom Mavis]
添加回答
举报