3 回答

TA貢獻1951條經(jīng)驗 獲得超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
區(qū)分大小寫。要忽略“Bob”的大小寫,您可以將b.startsWith("Bob")
(與 類似a
)替換為:
b.regionMatches(true, 0, "Bob", 0, 3)

TA貢獻1847條經(jīng)驗 獲得超11個贊
Collator
班級
用于比較和排序自然語言(人類語言)的規(guī)則正式稱為排序規(guī)則。
在Java中,任何排序規(guī)則都是在類實現(xiàn)Collator
類中定義的。通常,它的子類RulesBasedCollator
用于比較/排序。該類CollatorProvider
是一個SPI(服務(wù)提供者接口),用于提供注冊的Collator
實現(xiàn)。最近版本的 Java 默認使用Unicode Consortium在其公共區(qū)域設(shè)置數(shù)據(jù)存儲庫 (CLDR)中提供的排序規(guī)則定義。
Collator
據(jù)推測,您可以根據(jù)自己的需要自由地構(gòu)建自己的實現(xiàn),并使用此類特殊規(guī)則。
請注意,校對是一個非常復(fù)雜的領(lǐng)域,其規(guī)則因人類語言和文化規(guī)范而異。如果您只關(guān)心美式英語,那么您可能不會遇到什么問題。但如果您處理其他語言、文化或替代字符(例如?
或 表情符號),那么,這里就是龍。

TA貢獻2080條經(jīng)驗 獲得超4個贊
您需要做的第一件事是了解規(guī)則,例如,當(dāng)出現(xiàn)以下情況時會發(fā)生什么:
左邊和右邊都以“Bob”開頭?
當(dāng)左側(cè)和右側(cè)都不以“Bob”開頭時會發(fā)生什么?
您關(guān)心匹配案例嗎?
您只關(guān)心名字還是應(yīng)該包含姓氏或者您希望它是可配置的?
一個簡單的實現(xiàn)可能看起來像......
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);
}
}
現(xiàn)在,這會進行大小寫匹配(因此bob與 不同Bob),并將對自己組內(nèi)的所有“Bobs”進行子排序
正如您所看到的,五秒鐘的思考已經(jīng)提出了許多可能的方法來對列表進行排序,因此您需要了解您的選項,您可能希望自定義哪些選項以及您想要修復(fù)哪些選項。
您可以使用類似...的方式調(diào)用此示例
Collections.sort(list, new NameComparator("Bob"));
這將根據(jù)您可用的輸入、輸出...
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]
添加回答
舉報