当前位置: 首页 > 知识库问答 >
问题:

清单1中不在清单2 Java中的过滤器元素,而不使用流

端木宏才
2023-03-14

我有两个清单

     Class Fruit
     {
         private String name;
     }
     List<Fruit> list1 = new ArrayList<>;
     List<Fruit> list2 = new ArrayList<>;

通过fruit-name中的字段进行比较,查找清单1中不在清单2中的元素。

解决方案1:

     List list = new ArrayList<>;
     for(Fruit list : list1)
     {
          if(!list2.contains(list1)
          {
               list.add(list);
          }
     }

但这并不考虑要比较的字段名称。请建议帮助在不使用流的情况下使用名称字段进行筛选的解决方案

共有2个答案

陶法
2023-03-14

在数据量较大的情况下,考虑时间复杂度。在大多数情况下,我会考虑将列表转换为集合,并利用哈希表的特性来加快查找速度。

 Set<String> set = new HashSet<>();
 for(Fruit e:list2){
    set.add(e.name);
 }
 List<Fruit> result = new ArrayList<>();
 for(Fruit e:list1){
    if(!set.contains(e.name)){
        result.add(e);
    }
 }
齐建白
2023-03-14

这没有考虑Fruit名称,因为您没有实现equals方法。

From List boolean contains(对象o)

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表至少包含一个元素e,使得(o==null?e==null:o.equals(e))返回true。

在最后一个条件中,将根据equals实现检查的条件。

您必须在Fruit类中实现equals方法,以便根据name进行比较,下面是Eclipse generate equals方法,您可以根据需要进行更改:

public class Fruit {
    private String name;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Fruit other = (Fruit) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    } 

}

更新
无论如何,如果您不想实现equals方法,您必须做更多的工作,下面是流代码:

//It assume you have .getName() method in your Fruit class.
Predicate<Fruit> notInList2 = s -> list2.stream().noneMatch(e -> s.getName().equals(e.getName()));
List<Fruit> list3 =  list1.stream().filter(notInList2).collect(Collectors.toList());
 类似资料:
  • 问题内容: 我是Java的新手,我需要列出列表列表。我可以在python中做到这一点,因为列表的元素可以是列表,因此在嵌入式列表中将引用列表,并且将引用嵌入式列表的zeroeth元素。有什么简单的方法可以在Java中实现此行为? 问题答案: 所有其他答案在技术上都是正确的,但是恕我直言,如果您实施了粗略的列表列表,您将无法在正确的抽象级别上处理数据。例如,我很确定列表列表在您的业务领域中已经意味着

  • 我正在创建一个小应用程序,在应用程序的一部分,我正在创建一个下拉选择菜单,其中填充了数组中的值。 我的问题是,当表单被加载时,它成功地加载并用数组值填充选择选项,但问题是,当我向数组添加另一个元素并再次调用表单时,它仍然只会加载从何时开始的值该表单首先被调用。 当我按下提交按钮时,如何让选择选项清除其值。以下是所称的代码: 然后将该值传递给函数createObj(): 现在,什么样的javascr

  • 问题内容: 我正在尝试将CS​​V文件读入(字符串的)列表列表,将其传递以从数据库中获取一些数据,构建新数据列表的新列表,然后传递该列表列表,以便写入新的CSV文件。我到处都看了,似乎找不到如何做的例子。 我宁愿不使用简单的数组,因为文件的大小会有所不同,而且我也不知道该如何使用数组的尺寸。我没有处理文件的问题。我只是不确定如何处理列表列表。 我发现的大多数示例都将创建多维数组或在从文件中读取数据

  • 因为我想用一些动画来启动我的应用程序。我需要先开始动画活动。SplashActivity是动画活动。 在manifest中,我尝试这样做: 但我有一个错误: 执行 com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction Android 资源链接失败时发生故障 错误:/Users/kal

  • 问题内容: 运行代码 退货 因此,每次在列表列表中每次更新元组(列表)的第一个参数,但第二个参数list [0]却没有更新。有人可以解释这里发生的事情并提出解决方法吗?我想输出 问题答案: 列表是可变类型-为了创建副本(而不只是传递相同的列表),您需要明确地这样做: 但是,已经是Python内置的名称-最好不要将该名称用作变量。这是一个不用作变量名并复制的版本: 请注意,我演示了两种不同的方法来复

  • 问题内容: 如何合并列表列表? 进入 如果我可以在合并列表之前在每个项目的开头和结尾添加一个值(例如html标签),那就更好了。 即,最终结果将是: 问题答案: 要串联列表,可以使用 要添加HTML标签,您可以使用列表推导。