package murex.pop.dojo.listoflistsmedian; import java.util.Collections; import java.util.List; public class Median { public static int of(List<List<Integer>> ints) { int min = min(ints); int max = max(ints); for (int i = min; i <= max; i++) { final Ordinality ordinality = ordinality(i, ints); if (ordinality.isMedian()) { return i; } } throw new UnsupportedOperationException("Not found"); } public static int max(List<List<Integer>> lists) { int max = Integer.MIN_VALUE; for (List<Integer> integerList : lists) { max = Math.max(max, Collections.max(integerList)); } return max; } public static int min(List<List<Integer>> lists) { int min = Integer.MAX_VALUE; for (List<Integer> integerList : lists) { min = Math.min(min, Collections.min(integerList)); } return min; } public static Ordinality ordinality(int pivot, List<List<Integer>> lists) { Ordinality result = Ordinality.EMPTY; for (List<Integer> list : lists) { result = result.update(listOrdinality(pivot, list)); } return result; } private static Ordinality listOrdinality(int pivot, Iterable<Integer> list) { int above = 0; int below = 0; int equal = 0; for (Integer integer : list) { if (integer > pivot) { above++; } else if (integer < pivot) { below++; } else { equal++; } } return new Ordinality(below, above,equal); } }