簡體   English   中英

Java中基於動態串行有序輸入流對數據進行排序和分區

[英]sorting and partitioning data based on dynamic serial ordered input stream in java

我想按以下方式對元素進行排序和分組,如何使用java流進行排序,分組和分區依據。

輸入以流形式進來,這意味着在獲得以下輸入之后,有時A16,17之類的輸入可能會出現數據結構必須重新組織和重新組合的情況。

輸入A10,A4,A11,A3,A12,A15 .... B19,B2,B20 ...

輸出A3-A4,A10-A12,A15,B2,B19-B20。

我可以排序如下

array.sort(Comparator   .comparing(...)
                                .thenComparing(Comparator.comparing(...)));

但不確定如何使用流以最優化的方式對輸入進行分區和重組。

 array.stream().collect(Collectors.partitionBy(...))

為了實現串行順序分組,在上面進行分區的功能中的邏輯應該是什么?

如果您使用Java8 Stream接口編寫自己的ComparatorCollector ,則可以輕松實現:

array.stream().sorted(new MyComparator()).collect(new MyCollector());

Comparator器很容易編寫:

class MyComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        if(s1.substring(0, 1).compareTo(s2.substring(0,1)) < 0) {
            return -1;
        } else if (s1.substring(0, 1).compareTo(s2.substring(0,1)) > 0) {
            return 1;
        } else { //first char is equal
            if(Integer.parseInt(s1.substring(1, s1.length())) < Integer.parseInt(s2.substring(1, s2.length()))) {
                return -1;
            } else if (Integer.parseInt(s1.substring(1, s1.length())) > Integer.parseInt(s2.substring(1, s2.length()))) {
                return 1;
            }
        }
        return 0;
    }
}

它基本上在開頭檢查字母,然后在后面檢查數字。 嘗試使用自然字母順序會將A10, A11 ...放在A2,A3 ...之前A2,A3因為1<2

我故意不讓Collector編寫該部分,因為這是一個有趣的練習。

但是,如果您由於發現它太難而不想使用Collector ,則始終可以使用新排序的List來兩兩地獲取其元素,並創建另一個包含要查找的結果的List

暫無
暫無

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

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