Фильтровать перестановку объектов в списке>> с Java 8 - PullRequest
0 голосов
/ 30 ноября 2018

Начиная со списка Entry<String, Double> Я только что нашел все комбинации с помощью следующего метода:

public static <T> Stream<List<T>> getCombinationsStream(List<T> list) {   
    return LongStream.range(1 , 1 << list.size())
            .mapToObj(l -> bitMapToList(l, list));
}

Теперь я хочу отфильтровать полученные списки записей только для тех, у кого сумма всехего значение

entry.getValue ()

равно известному числу.

List<Entry<String, Double>> myList;
double value = 100; 

//...

List<List<Entry<String, Double>>> allCombinations = Permutations.getCombinationsStream(myList)
                .collect(Collectors.toList());

после этого моя цель - взять толькоСписок записей с наименьшим размером, сумма его значения которого равна моему значению (то есть 100)

пример:

/*
* allCombinatinos example 
*
* [[k1=90.0],[k2=30],[k3=70],
* [k1=90.0, k2=30],[k1=90.0, k3=70],[k2=30, k3=70],
* [k1=90.0, k2=30, k3=70]]
*/

с этими списками, ожидаемый результат будет только одним списком:

//result
[k2=30, k3=70]

Я думаю, что эту проблему можно решить с помощью .filter () и других потоковых операций, но я не знаю, как это выяснить.

1 Ответ

0 голосов
/ 30 ноября 2018

Вот один из способов:

Optional<List<Entry<String, Double>>> min = 
        getCombinationsStream(myList)
                 .filter(l -> l.stream()
                               .mapToDouble(Map.Entry::getValue).sum() == value)
                 .min(Comparator.comparingInt(List::size));

фильтрует по указанным критериям, затем находит список записей с минимальным размером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...