[英]Is it possible to change priority(weight) of certain symbols in sorting?
我想為字符串值創建一個比較器,但根據https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html下划線符號比任何數字都具有更大的價值。 有可能以某種方式改變它嗎?
簡答
是的。 您需要一個自定義字符串比較器。
解決方案
假設您需要對字符串列表進行排序:
[a_123, ab123, a123, 123, _123]
如果您使用Collections.sort
對其進行排序,那么它將按以下順序進行排序:
[123, _123, a123, a_123, ab123]
但是您想覆蓋_
的“權重”。 為此,您需要一個自定義字符串比較器。 讓我們復制並修改一下java.lang.String#compareTo
:
private int customStringComparator(String s1, String s2) {
int len1 = s1.length();
int len2 = s2.length();
int lim = Math.min(len1, len2);
char v1[] = s1.toCharArray();
char v2[] = s2.toCharArray();
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
// You can add your custom comparison here:
if ('_' == c1 && Character.isDigit(c2)) {
// We intentionally return inverted result
return c2 - c1;
}else if(c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
現在我們可以將customStringComparator
傳遞給Collections.sort
:
Collections.sort(list, this::customStringComparator);
該列表將按以下順序排序:
[_123, 123, a_123, a123, ab123]
如您所見,現在_
在數字之前。
這可能有效:
private int compareStrings(String o1, String o2) {
if(o1.matches("\\d+") && o2.equals("_")) {
return 1;
}
if(o1.equals("_") && o2.matches("\\d+")) {
return -1;
}
return o1.compareTo(o2);
}
然后像這樣定義你的比較器:
Comparator<String> stringComparator2 = this::compareStrings;
編輯:
根據不為中間帶有_
字符串工作,如何將_
替換為 ASCII 表中之前的字符以進行比較(例如" "
):
public static int compareStrings(String o1, String o2) {
o1 = o1.replaceAll("_", " ");
o2 = o2.replaceAll("_", " ");
return o1.compareTo(o2);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.