簡體   English   中英

使用比較器排序

[英]Sorting using comparator

我需要使用 Java 8 比較器對以下詳細信息class 對象列表進行排序


    class Details{
      String name;
      String age;

    }

按照詳細信息類名稱的順序,如下所示

第一——從字母開始

2nd——以數字開頭

和 3rd-- 以特殊字符開頭

預期結果 s/b:已排序的詳細信息列表 = 根據詳細信息名稱排序,與 class 中的其他參數無關

    "Came"

    "result"

    "Result came"

    "01 Result"

    "02 Result"

    "05 Result"

    "# Came"

    "# Result"
    Collections.sort(List.o(details1,details2,details3),(d1,d2)->{

    // got stuck here what to include to achieve the sort as per my requirement

    return d1.getName().compareTo(d2.getName());
    });

您可以像這樣定義自定義優先級

private static int priority(String str){
    if (Character.isAlphabetic(string.charAt(0)))return 1;
    if (Character.isDigit(string.charAt(0)))     return 2;
    return 3;
}

然后你可以在比較中使用 function

Collections.sort(list, new Comparator<Project>() {
    @Override
    public int compare(Details o1, Details o2) {
        int result = Integer.compare(priority(o1.name), priority(o2.name));
        if (result != 0) return result;
        return o1.name.compareTo(o2.name);
    }
});

使用 java 8 語法

Collections.sort(list,Comparator.comparingInt(d -> priority(d.getName()))
                                .thenComparing(d-> d.getName()));

這是 Java 11(剛剛使用 var,就是這樣)代碼:

    var a = List.of(details1, details2, details3)
                .stream()
                .sorted(Comparator.comparingInt((Details d) -> priority(d.getName())).thenComparing(Details::getName))
                .collect(Collectors.toList());

如果優先方法難以理解,可以參考@Eklavya 的代碼


    private static int priority(String str){
        return Character.isAlphabetic(str.charAt(0))?1:Character.isDigit(str.charAt(0))?2:3;
      }

暫無
暫無

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

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