使用 Java 8 在 List<List<Entry<String、Double>>> 中过滤对象排列



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((和其他流操作来处理,但我不知道如何解决。

这里有一种方法:

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

具有所述标准的过滤器然后找到具有最小大小的条目列表。

最新更新