簡體   English   中英

是否可以在排序中更改某些符號的優先級(權重)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM