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

问题描述

*作为序言,我发布了一个类似的问题,但是这次,我想要的输出将有所不同。 假设我们有一个叫Bob的人,他有一个他写下的整数列表:

bobList = [10,25,30,50]

假设系统还生成了3个其他随机整数列表,并将它们放入1个主列表中:

list1 = [1,10,20,33,55]
list2 = [2,3,5,6,9,30]
list3 = [25,50,100]
List<List<Integer>> masterList = new ArrayList<>()
masterList.add(list1)
masterList.add(list2)
masterList.add(list3)

可以假设系统生成的3个数字列表是从最小到最大的顺序,而鲍勃的列表也是从最小到最大的顺序。目的是浏览Bob的列表,并查看Bob写下的每个数字是否包含在主列表的每个列表中。我用Java 11的流进行了尝试,尝试通过像这样输出显示鲍勃列表中的每个整数是否属于3个列表中的每一个

{10=[true,false,false],25=[true,true],30=[false,true,50=[false,true]}

我认为这类似于Bob的列表,但他写的每个整数都是键,而值是Boolean的列表,其中每个索引都是对应的列表,如果为true,则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);     

输出类似于:

{false=[1,55],true=[10,25]}
{false=[2,9],true=[30]}
{false=[100],true=[25,50]}

如您所见,这种方式将masterList中的3个列表与bobList进行比较,并像false和true一样输出它,并拆分bobList中的数字和不拆分的数字。但是,我尝试将其翻转,然后查看bobList中的哪些数字在masterList的列表中,并按照我想要的方式输出它,但我只是被卡住并尝试不同的方法

我曾经使用过的部分解决方案是从boblist转到1个列表:

masterList.stream().map(l -> l.contains(i)).collect(Collectors.toList()))));

但是我不确定从何处获取列表的相应密钥。

更新:谢谢Holger,我忘记了您可以两次使用.collect()

解决方法

如果您想对流进行此操作,则解决方案是对流bobList进行流处理并将流作为地图收集。映射中的值本身可以通过流masterList并映射到表示键是否在关联列表中的布尔值来生成。

将所有内容放在一起:

Map<Integer,List<Boolean>> result = bobList.stream()
    .collect(Collectors.toMap(
        i -> i,i -> masterList.stream().map(l -> l.contains(i)).collect(Collectors.toList()))));

如Holger所建议:l.contains(i)可以替换为Collections.binarySearch(l,i) >= 0,这可以依靠预先排序的事实来加快搜索速度。但是除非您的清单很长,否则此地图将被构建很多次,我希望差异不会太大。

您还在注释中(而不是原始问题)提到要维护键顺序。您可以通过显式使用LinkedHashMap来做到这一点。

,

尝试将问题分解为多个步骤,并执行每个步骤! (伪代码有很大帮助):)我会给您一些提示:

您的目标是遍历bobList并检查list1,list2和list3(通过遍历Masterlist)是否具有整数,然后打印该结果。例如,您可以使用for循环进行迭代。

如何检查列表是否包含该整数?像list.contains()方法有帮助吗?

对于输出,您可以根据需要输出任何内容,只要它看起来不错并且符合条件即可。 例如,如果您想对输出内容有所了解:

10: |true|false|false|

您可以在for循环内的迭代过程中立即打印布尔值。