我想对元素进行排序并按如下方式对它们进行分组,如何使用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(...)));
但不确定如何使用流以最优化的方式对chaning输入进行分区和重组。
array.stream().collect(Collectors.partitionBy(...))
为了实现串行顺序分组,上面的分区功能逻辑应该是什么?
答案 0 :(得分:1)
如果您使用Java8 Comparator
界面编写自己的Collector
和自己的Stream
,则可以轻松完成:
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
...之前,因为1<2
。
我离开Collector
故意不成文,因为这是一个有趣的练习。
但是如果你不想使用Collector
,因为你发现它太难了,你总是可以使用新订的List
来逐个抓取它的元素并创建另一个{{1}包含您要查找的结果。