Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Java列表:使用lambda表达式获取具有成对不同键的对的数量_List_Lambda_Stream_Hashmap - Fatal编程技术网

List Java列表:使用lambda表达式获取具有成对不同键的对的数量

List Java列表:使用lambda表达式获取具有成对不同键的对的数量,list,lambda,stream,hashmap,List,Lambda,Stream,Hashmap,我有一个键值对列表,我想筛选一个每个键参数只出现一次的列表 例如,{Pair(1,2),Pair(1,4),Pair(2,2)}的列表变成{Pair(1,2),Pair(2,2)} 过滤掉哪个对无关紧要,因为我只需要大小 (也许有一种不同的方法可以获得具有成对不同键值的对的数量?) 这一切再次发生在列表(键值对)数组的另一个流中,它们都被加起来了 我基本上想要hashmap中的冲突量 我希望你明白我的意思;如果没有,请询问 public int collisions() { return

我有一个键值对列表,我想筛选一个每个键参数只出现一次的列表

例如,
{Pair(1,2),Pair(1,4),Pair(2,2)}
的列表变成
{Pair(1,2),Pair(2,2)}

过滤掉哪个
无关紧要,因为我只需要大小 (也许有一种不同的方法可以获得具有成对不同键值的对的数量?)

这一切再次发生在列表(键值对)数组的另一个流中,它们都被加起来了

我基本上想要hashmap中的冲突量

我希望你明白我的意思;如果没有,请询问

public int collisions() {
    return Stream.of(t)
            .filter(l -> l.size() > 1)
            .filter(/*Convert l to list of Pairs with pairwise different Keys*/)
            .mapToInt(l -> l.size() - 1)
            .sum();
}
编辑:

如果键相同,我重写了Pair的equals以返回true,因此现在我可以使用distinct删除“重复项”(具有相等键的对)。 在forEach中,是否可以用相同的列表“distincted”替换currentElement?如果是,怎么做

问候,,
Claas M不使用流。使用自定义比较器将列表转储到SortedSet中,并区分大小:

List<Pair<K, V>> list; // given this

Set<Pair<K, V>> set = new TreeSet<>(list, (a, b) -> a.getKey().compareTo(b.getKey())).size();
set.addAll(list);
int collisions = list.size() - set.size();
列表列表;//鉴于此
Set Set=newtreeset(list,(a,b)->a.getKey().compareTo(b.getKey()).size();
set.addAll(列表);
int collisions=list.size()-set.size();

如果键类型不可比较,请相应地更改比较器lambda。

我不确定您是要将每个列表的冲突量之和还是所有列表中的冲突量合并到一个列表中。我假设是前者,但如果是后者,想法不会有太大变化

这是如何使用

int collisions = Stream.of(lists)
                       .flatMap(List::stream)
                       .mapToInt(l -> l.size() - (int) l.stream().map(p -> p.k).distinct().count())
                       .sum();

Stream.of(list)
将为您提供
Stream我认为此任务非常适合Stream。此外,您不能在
TreeSet
构造函数中指定比较器和集合,因此您必须分几个步骤来完成(您在我编辑问题时回答了我的问题,添加了类似的方法;),这看起来非常好!但是“mapToInt”中的“l”是Pair类型(我猜是因为它是flatmapped)。我不熟悉Java 8,所以我自己无法解决它。你能帮忙吗?@ClaasM。您在谈论哪个实现?你的编辑没有多大意义
forEach
是一个终端操作,因此在调用它之后不能链接流操作。你为什么要使用forEach
呢?我是说你的实现。我想使用forEach对列表数组(成对)中的每个列表调用distinct。“但你的方法看起来更好,我想你对streams等了解更多。但我还是无法让它发挥作用,因为上面说我是结对类型的。”克拉斯。不,它应该是一个列表。假设
列表
是一个
列表
流(列表)。flatMap(列表::流)
应该为您提供一个
。你们试过我的输入数据示例了吗?啊,好吧,我的错误是我在Stream.of(…)中使用了列表数组而不是列表列表列表。asList(myArray)修复了它。非常感谢你!
int collisions = Stream.of(lists)
                       .flatMap(List::stream)
                       .mapToInt(l -> l.size() - (int) l.stream().map(p -> p.k).distinct().count())
                       .sum();
List<Pair<Integer, Integer>> l1 = Arrays.asList(new Pair<>(1,2), new Pair<>(1,4), new Pair<>(2,2));
List<Pair<Integer, Integer>> l2 = Arrays.asList(new Pair<>(2,2), new Pair<>(1,4), new Pair<>(2,2));
List<Pair<Integer, Integer>> l3 = Arrays.asList(new Pair<>(3,2), new Pair<>(3,4), new Pair<>(3,2));

List<List<Pair<Integer, Integer>>> lists = Arrays.asList(l1, l2, l3);