Создать TreeMap из вложенного списка, используя потоки Java - PullRequest
0 голосов
/ 11 января 2019

Дано: У меня есть List<List<Integer>> locations, который является координатами местоположения. Например, место A: (2,4), место B: (5,4), место C: (10,9), место D: (2,4). Так что мой locations будет содержать список списков. Я не могу изменить этот формат.

Стоимость перехода в определенное место - это квадратный корень из суммы координат. Таким образом, перейти к стоимости составляет Place A = Math.sqrt(2 + 4), стоимость перейти к Place B = Math.sqrt(5 + 4) и т. Д.

Вывод : я пытаюсь получить список наименее «затратных» из всех мест. Требование возврата List<List<Integer>> nearestLocations. Я пытался создать TreeMap<Double, List<List<Integer>>

Вопрос Мой вопрос: как мне преобразовать приведенное ниже преобразование с использованием потоков Java 8?

 List<List<Integer>> findNearestLocation(int total, List<List<Integer>> allLocations, int size) {
        ArrayList<List<Integer>> results = new ArrayList<>();
        TreeMap<Double, List<Integer>> map = new TreeMap<>();
        for (int i = 0; i < total && i < allLocations.size(); i++) {
            List<Integer> list = allLocations.get(i);
            double l = 0.0;
            for (Integer x : list) {
                l += x * x;
            }
            map.put(Math.sqrt(l), list);
        }
        if (map.size() > 0) {
            for (int get = 0; get < size; get++) {
                results.add(map.get(map.firstKey()));
                map.remove(map.firstKey());
            }

        }
        return results;
    }

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Если вы просто хотите отсортировать этот список по их расстоянию, вы можете просто сделать

Collections.sort(list, (list1, list2) -> 
    Double.compare(Math.sqrt(list1.get(0) + list1.get(1)),
                   Math.sqrt(list2.get(0) + list2.get(1))));

или на копии списка, если первоначальный список является неизменным.

0 голосов
/ 11 января 2019

Ваш Map на самом деле Map<Double, List<Integer>>

Ваш текущий код возвращает только Map, если вы хотите TreeMap вам нужно:

    TreeMap<Double, List<List<Integer>>> x = locations.stream().collect(
            Collectors.groupingBy((List<Integer> b) -> {
                        double d = b.stream().mapToDouble(i -> i.doubleValue()).sum();
                        return Math.sqrt(d);
                    },
                    TreeMap::new,
                    Collectors.toList()));

PS: Ваше расстояние не является обычным евклидовым расстоянием. Чтобы сделать так, вам нужно i -> i.doubleValue() * i.doubleValue()

...