如何解决用于检查列表中的整数是否包含在整数列表的另一个列表中的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循环内的迭代过程中立即打印布尔值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。