如何解决用于检查列表中的一个项目是否在另一个项目列表中的Java方法有点像excel中的VLOOKUP?
说我们有一个整数列表。看起来像[list1,list2,list3],基本上是List
include
因此,如果我们将列表中的每个列表与masterList进行比较,则最终结果应该是列表的列表,但是每个列表将具有指示它们是否在主列表中的更新值,因此对于伪代码清酒:
List<Integer> masterList = Arrays.asList(122,123,124,155,621,982);
List<Integer> list1 = Arrays.asList(122,331,982);
List<Integer> list2 = Arrays.asList(122,444);
List<Integer> list3 = Arrays.asList(2,122,133,332,667,982);
// I guess each list Could be on its own,but for my purposes the lists are in a list,so:
List<List<Integer>> lists = new ArrayList<>();
lists.add(list1);
lists.add(list2);
lists.add(list3);
我尝试对此进行编码,但失败了,我尝试提出的某些解决方案的时间/空间复杂度非常差。 假定所涉及的每个列表都是经过排序的,唯一的,并且大小不必相同。
原始列表必须是Integer类型的,以便可以对其进行排序,但是我知道最后需要一个新列表,其中包含3个新列表,这些列表最后是String类型,而不是Integer类型不再。这有点像在Excel中使用VLOOKUP将3列与1列进行比较。如果有人可以提供解决方案,您将得到我的祝福!谢谢!
解决方法
解决方案
只需对列表中出现的每个数字使用Stream::map
。使用三元运算符,可以将其转换为self或具有(#N/A)
前缀的新String值。请注意,只要List<List<String>>
不是整数值,新返回的结构就是331(#N/A)
。
List<List<String>> checkedList = lists.stream()
.map(list -> list.stream()
.map(i-> masterList.contains(i) ? i + "" : i + "(#N/A)")
.collect(Collectors.toList()))
.collect(Collectors.toList());
checkedList.forEach(System.out::println); // results in the output below
[122,124,155,331(#N/A),982] [122,444(#N/A)] [2(#N/A),122,123,133(#N/A),332(#N/A),621,667(#N/A),982]
建议
但是,结果有点可疑,您将无法轻松处理数字,并且数据看起来很脏。我宁愿根据masterList
中元素的存在将列表分成两部分。使用Collectors.partitioningBy
:
List<Map<Boolean,List<Integer>>> map = lists.stream()
.map(list -> list.stream()
.collect(Collectors.partitioningBy(masterList::contains)))
.collect(Collectors.toList());
map.forEach(System.out::println); // results in the output below
{false=[331],true=[122,982]} {false=[444],124]} {false=[2,133,332,667],982]}
false
指示masterList
中存在的 not 。 true
代表其他情况。随时在JDoodle进行检查。
您可以使用整数列表,每个列表为布尔对,然后可以按对的整数部分对列表进行排序。要进行配对,您可以使用AbstractMap.SimpleEntry
。
List<List<AbstractMap.SimpleEntry<Integer,Boolean>>> res =
lists.stream()
.map(e -> e.stream()
.map(ee -> new AbstractMap.SimpleEntry<>(ee,masterList.contains(ee)))
.collect(Collectors.toList()))
.collect(Collectors.toList());
在这里,通过使用Integer
方法检查AbstractMap.SimpleEntry<Integer,Boolean>
中是否存在列表的每个元素,将每个masterList
转换为contains()
我猜想(N/A)
仅用于查看部分,如果您想直接为元素存储字符串,则也可以使用AbstractMap.SimpleEntry<Integer,String>
并将其映射为
ee -> new AbstractMap.SimpleEntry<>(ee,masterList.contains(ee)? "(N/A)" : null)
仅按List<AbstractMap.SimpleEntry<Integer,Boolean>>
部分对Integer
进行排序。
Collections.sort(list,Comparator.comparing(e -> e.getKey()));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。