检查列表中的整数是否包含在整数列表的另一个列表中的Java方法
*在前言中,我提出了一个类似的问题,但这一次,我想要的结果将有所不同。 假设我们有一个叫Bob的人,他写了一个整数列表:检查列表中的整数是否包含在整数列表的另一个列表中的Java方法,java,list,algorithm,data-structures,java-8,Java,List,Algorithm,Data Structures,Java 8,*在前言中,我提出了一个类似的问题,但这一次,我想要的结果将有所不同。 假设我们有一个叫Bob的人,他写了一个整数列表: bobList = [10, 25, 30, 50] 假设系统生成了另外3个随机整数列表,并放入1个主列表中: list1 = [1, 10, 20, 25, 33, 55] list2 = [2, 3, 5, 6, 9, 30] list3 = [25, 30, 50, 100] List<List<Integer>> masterList = n
bobList = [10, 25, 30, 50]
假设系统生成了另外3个随机整数列表,并放入1个主列表中:
list1 = [1, 10, 20, 25, 33, 55]
list2 = [2, 3, 5, 6, 9, 30]
list3 = [25, 30, 50, 100]
List<List<Integer>> masterList = new ArrayList<>()
masterList.add(list1)
masterList.add(list2)
masterList.add(list3)
我认为这类似于Bob的列表,但他写的每个整数都是键,值是一个布尔值列表,其中每个索引都是对应的列表,如果它为真,那么Bob写的数字就在列表中,反之亦然,则为假。但问题是,我对编程有点陌生,在我看来,所有这些数据结构和算法真的让我很困惑,我在过去的一天里一直在坚持这一点。是否有人可以发布一个解决方案,使输出看起来与所描述的一样?或者,如果你有一个更好的输出建议,有一个更容易的看法,然后通过一切手段,我一定要改善它!谢谢大家!
更新:我完全忘了添加我的尝试,但我玩了这件作品:
List<Map<Boolean, List<Integer>>> test = bobList.stream()
.map(list -> list.stream()
.collect(Collectors.partitioningBy(masterList::contains)))
.collect(Collectors.toList());
test.forEach(System.out::println);
如您所见,这种方法将主列表中的3个列表与bobList进行比较,并将其输出为false和true,并拆分bobList中的数字和bobList中的数字。然而,我试着翻转它,看看BoblList中的哪些数字在masterList的列表中,然后按照我想要的方式输出,但我只是被卡住了,并用不同的尝试进行循环
我的一个部分解决方案是使用以下方法从boblist变为1个列表:
masterList.stream().map(l -> l.contains(i)).collect(Collectors.toList()))));
但我不确定从哪里获得列表的相应键
更新:感谢Holger,我忘了你可以使用.collect()两次如果你想对streams执行此操作,那么解决方案是将
bobList
流式处理,并将流收集为地图。映射中的值本身可以通过流式主列表
生成,并映射到表示键是否在关联列表中的布尔值
综上所述:
Map<Integer,List<Boolean>> result = bobList.stream()
.collect(Collectors.toMap(
i -> i,
i -> masterList.stream().map(l -> l.contains(i)).collect(Collectors.toList()))));
Map result=bobList.stream()
.collect(collector.toMap)(
我->我,
i->masterList.stream().map(l->l.contains(i)).collect(Collectors.toList());
正如霍尔格所建议的:l.contains(i)
可以被Collections.binarySearch(l,i)>=0
所取代,它依靠预先排序的事实来加快搜索速度。但是,除非你的列表很长,或者这张地图会被构建很多次,否则我希望差别会很小
您还可以在注释(而不是原始问题)中提到希望维护密钥顺序。您可以显式地使用
LinkedHashMap
将问题分解为多个步骤,并执行每个步骤!(伪代码非常有用):)我给你一点提示:
这里的目标是迭代bobList,检查list1、list2和list3(通过迭代主列表)是否包含整数,并打印结果。例如,可以使用for循环进行迭代
如何检查列表是否包含该整数?类似list.contains()的方法是否有帮助
至于输出,您可以随心所欲地输出它,只要它看起来不错并且符合标准。
例如,如果您想对输出有一点幻想:
10: |true|false|false|
您可以在for循环内的迭代过程中立即打印布尔值。请添加您当前的尝试,即使它不起作用;它显示了您自己的努力。只是给您一些搜索词:您正在寻找多个排序集的交集。我不知道你是否被允许使用集合而不是列表,或者你的任务是否有其他限制,但一种方法是使用类似于
[TreeSet
]的东西及其方法。(但此解决方案中没有流)。到目前为止您尝试了什么?我在上面添加了我的尝试,请帮助我解决问题谢谢!缺少一些结束括号。除此之外,由于OP表示列表保证按升序排列,您可以将l->l.contains(i)
替换为l->Collections.binarySearch(l,i)>=0
@iHaveQuestion no,要按顺序获得结果,您需要一个维护顺序的映射,即收集器.toMap(i->i,i->masterList.stream().map(l->l.contains(i)).collect(Collectors.toList()),(a,b)->{抛出新的非法状态异常(“重复”);},LinkedHashMap::new))
。利用源列表的排序性质,比由List.contains执行的线性搜索更快。
Map<Integer,List<Boolean>> result = bobList.stream()
.collect(Collectors.toMap(
i -> i,
i -> masterList.stream().map(l -> l.contains(i)).collect(Collectors.toList()))));
10: |true|false|false|