我有两个清单
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);
}
}
但这并不考虑要比较的字段名称。请建议帮助在不使用流的情况下使用名称字段进行筛选的解决方案
在数据量较大的情况下,考虑时间复杂度。在大多数情况下,我会考虑将列表转换为集合,并利用哈希表的特性来加快查找速度。
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);
}
}
这没有考虑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
问题内容: 我正在尝试将CSV文件读入(字符串的)列表列表,将其传递以从数据库中获取一些数据,构建新数据列表的新列表,然后传递该列表列表,以便写入新的CSV文件。我到处都看了,似乎找不到如何做的例子。 我宁愿不使用简单的数组,因为文件的大小会有所不同,而且我也不知道该如何使用数组的尺寸。我没有处理文件的问题。我只是不确定如何处理列表列表。 我发现的大多数示例都将创建多维数组或在从文件中读取数据
因为我想用一些动画来启动我的应用程序。我需要先开始动画活动。SplashActivity是动画活动。 在manifest中,我尝试这样做: 但我有一个错误: 执行 com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction Android 资源链接失败时发生故障 错误:/Users/kal
问题内容: 运行代码 退货 因此,每次在列表列表中每次更新元组(列表)的第一个参数,但第二个参数list [0]却没有更新。有人可以解释这里发生的事情并提出解决方法吗?我想输出 问题答案: 列表是可变类型-为了创建副本(而不只是传递相同的列表),您需要明确地这样做: 但是,已经是Python内置的名称-最好不要将该名称用作变量。这是一个不用作变量名并复制的版本: 请注意,我演示了两种不同的方法来复
问题内容: 如何合并列表列表? 进入 如果我可以在合并列表之前在每个项目的开头和结尾添加一个值(例如html标签),那就更好了。 即,最终结果将是: 问题答案: 要串联列表,可以使用 要添加HTML标签,您可以使用列表推导。