检查列表中的整数是否包含在整数列表的另一个列表中的Java方法

检查列表中的整数是否包含在整数列表的另一个列表中的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

*在前言中,我提出了一个类似的问题,但这一次,我想要的结果将有所不同。 假设我们有一个叫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 = 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|