簡體   English   中英

Java 8按位置中的屬性對列表進行分組

[英]Java 8 Group a List by attribute in a place

我是Java的長期開發人員,但對如何執行以下操作感到好奇,盡管我確信它是可行的,但我還沒有找到使用Java 8在線完成的類似操作。

說我有一個對象列表,列表中的每個對象都有一個名稱。 可能有三個名稱:“ Jack”,“ Terry”,“ Jon”,雖然有100個對象。 在Java 8中,用一行代碼,如何對數組進行“排序”,使得所有的Terry都將是第一個,然后是所有的Jacks,然后是所有的Jons?

使用列表定義排序順序是不正確的。 否則,這與Pankaj Singhal的建議相同:

    Map<String,Integer> order = Map.of("Terry", 0, "Jack", 1, "Jon", 2);
    sortedList = list.stream()
            .sorted(Comparator.comparing(i -> order.getOrDefault(i.getName(), MAX_VALUE)))
            .collect(toList());

或者,如果需要就地排序:

    Collections.sort(list, Comparator.comparing(i -> order.getOrDefault(i.getName(), MAX_VALUE)));

這是三元組的解決方案:

names.sort((a, b) -> 
    a.name.equals("Terry") ? -1 : 
    b.name.equals("Terry") ? 1 : 
    a.name.compareTo(b.name)
);

說明

如果ab"Terry" ,則排序無論如何都較小。 自然地對其他所有內容進行排序。 對於ab均為"Terry" ,可以將任意一個排序為較小的值(在這種情況下為a ),這使其成為不穩定的排序。

示例樣本在這里

讓以下列表代表排序順序:

List<String> sortOrder = Arrays.asList("Terry","Jack","Jon");

我們可以對元素進行如下排序:

MyClass[] sorted = Arrays.stream(initial)
                        .sorted(Comparator.comparingInt(o -> sortOrder.indexOf(o.name)))
                        .toArray(MyClass[]::new);

輸出:

[Terry, Terry, Terry, Jack, Jon, Jon]

暫無
暫無

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

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