微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于检查列表中的一个项目是否在另一个项目列表中的Java方法有点像excel中的VLOOKUP?

如何解决用于检查列表中的一个项目是否在另一个项目列表中的Java方法有点像excel中的VLOOKUP?

说我们有一个整数列表。看起来像[list1,list2,list3],基本上是List 。然后假设我们有一个主列表masterList,它只是List。有没有一种方法可以检查List 中的每个列表,以及每个列表中的每个值,如果该值或项目在主列表中,则保持原样,但如果不在主列表中,则存在旁边应该是“(N / A)”。例如:

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 举报,一经查实,本站将立刻删除。