[英]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
接口編寫自己的Comparator
和Collector
,則可以輕松實現:
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.