簡體   English   中英

Java Collections.sort()比較器

[英]Java Collections.sort() Comparator

我正在排序自定義對象。 自定義對象包含狀態和時間戳。 首先,我必須對狀態進行排序,然后對時間戳進行排序。 低於數值的狀態

運行,等待,注冊,完成和中止

因此,具有運行價值的狀態應該放在最上面,然后是等待狀態,依此類推。

如果我必須按字母順序排序,那么我可以輕松地通過

state1.compareTo(state2)

但是我可以按照這個標准進行排序嗎? 請幫我寫這個邏輯。

編輯

正如你們所建議的,我服用了Enum

private enum TournamentState {
    Running,
    Waiting,
    Registering,
    Completed,
    Aborted
}

並比較如下

int sort = EnumState.valueOf(status1).compareTo(EnumState.valueOf(status2));

if(sort != 0){
  return sort;
}else{
   return (int) (time1 - time2);
}

非常感謝您的支持。

您可以使用比較器功能的組成:

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getState)
    .thenComparing(MyClass::getTimeStamp);

最后一行可能需要相應地更改,具體取決於數據類型:

.thenComparingLong(MyClass::getTimeStamp); //if it's a long TS

甚至

.thenComparing((ts1, ts2) -> {
    //custom comparison logic for time stamp values
    return result;
 });

Comparator.thenComparing帶有以下注釋:

返回帶有另一個比較器的字典順序比較器。 如果此比較器認為兩個元素相等,即compare(a,b)== 0,則使用其他元素確定順序。

請注意,在這種情況下,假定MyClass.state是可比較的,例如作為枚舉,其本質上是可比較的。 如果是純字符串,那么您可能也需要自定義邏輯,例如:

final String order = "Running, Waiting, Registering, Completed and Aborted";
Comparator<MyClass> comparator = 
  Comparator.comparingInt(e -> order.indexOf(e.getState()))
    .thenComparing(MyClass::getTimeStamp);

您可以為State類創建一個自定義比較器,如下所示:

public final class StateComparator implements Comparator<State>
{

    private int getRank(final State s)
    {
        if (s.getValue().equals("Running"))
        {
            return 1;
        } else if (s.getValue().equals("Waiting")) {
            return 2;
        } else if (s.getValue().equals("Registering")) {
            return 3;
        } else if (s.getValue().equals("Completed")) {
            return 4;
        } else if s.getValue().equals("Aborted") {
            return 5;
        } else {
            return Integer.MAX_VALUE;
        }

    }

    public int compare(final State s1, final State s3)
    {
        return getRank(s1) - getRank(S2);
    }

}

您可以創建一個枚舉

public enum State {
    RUNNING, WAITING, REGISTERING, COMPLETED, ABORTED
}

默認情況下,這些狀態將獲得一個序數整數,該整數將與您在枚舉中寫入它們的順序一致。 然后用這個State為您的state在對象和創建比較

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getState)
    .thenComparing(MyClass::getTimeStamp);

然后可以使用比較器對集合進行排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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