package com.shekhargulati.ninetynine_problems._01_lists;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
/**
* (**) Sorting a list of lists according to length of sublists
*/
public class P28 {
public static <T> List<List<T>> lsort(List<List<T>> list) {
list.sort((xs1, xs2) -> xs1.size() - xs2.size());
return list;
}
public static List<List<String>> lfsort(List<List<String>> list) {
Map<Integer, Integer> freqs = new HashMap<>();
list.stream().map(List::size).forEach(l -> freqs.put(l, freqs.compute(l, (k, v) -> v == null ? 1 : v + 1)));
return list
.stream()
.sorted((xs1, xs2) -> freqs.get(xs1.size()) - freqs.get(xs2.size()))
.collect(toList());
}
/*
Same as scala code. This code does not works correctly because elements with same length are at different position
*/
public static List<List<String>> lfsort1(List<List<String>> list) {
return lsort(
lsort(list)
.stream()
.collect(groupingBy(List::size))
.values().stream().collect(toList()))
.stream()
.flatMap(Collection::stream)
.collect(toList());
}
}