How do I sort a List of TreeSets with java8 streams

前端 未结 3 1623
陌清茗
陌清茗 2021-01-12 09:01

My list contains sets like [1,3,5][2,6,4] etc, all of the same size. I tried doing this but it doesn\'t seem to work.

List&g         


        
3条回答
  •  旧巷少年郎
    2021-01-12 09:17

    Adding another answer since this would be bigger than a comment. It's really what the accepted answer has done, but with a "smarter" combiner that does not have to stream all the time again.

     private static  Collector>> partitioning(int size) {
        class Acc {
            int count = 0;
    
            List> list = new ArrayList<>();
    
            void add(T elem) {
                int index = count++ / size;
                if (index == list.size()) {
                    list.add(new ArrayList<>());
                }
                list.get(index).add(elem);
            }
    
            Acc merge(Acc right) {
    
                List lastLeftList = list.get(list.size() - 1);
                List firstRightList = right.list.get(0);
                int lastLeftSize = lastLeftList.size();
                int firstRightSize = firstRightList.size();
    
                // they have both the same size, simply addAll will work
                if (lastLeftSize + firstRightSize == 2 * size) {
                    System.out.println("Perfect!");
                    list.addAll(right.list);
                    return this;
                }
    
                // last and first from each chunk are merged "perfectly"
                if (lastLeftSize + firstRightSize == size) {
                    System.out.println("Almost perfect");
                    int x = 0;
                    while (x < firstRightSize) {
                        lastLeftList.add(firstRightList.remove(x));
                        --firstRightSize;
                    }
                    right.list.remove(0);
                    list.addAll(right.list);
                    return this;
                }
    
                right.list.stream().flatMap(List::stream).forEach(this::add);
                return this;
            }
    
            public List> finisher() {
                return list.stream().map(LinkedHashSet::new).collect(Collectors.toList());
            }
    
        }
        return Collector.of(Acc::new, Acc::add, Acc::merge, Acc::finisher);
    }
    

提交回复
热议问题