gpt4 book ai didi

java - 从 java 列表中删除相同的项目

转载 作者:搜寻专家 更新时间:2023-11-01 04:03:19 27 4
gpt4 key购买 nike

我有一个项目列表,其中每个项目都是一个包含 2 个公共(public)字符串的简单类。我有一个 equals 方法,它只对两个字符串使用 String 的 equalsIgnoreCase 方法。

public class data
{
public String a;
public String b;

public boolean equals(data d)
{
if(a.equalsIgnoreCase(d.a) && b.equalsIgnoreCase(d.b))
{
return true;
}
else
{
return false;
}
}
}

我希望能够删除一个元素,即使它不是列表中元素的同一个实例但等于它。

现在我正在这样做:

public void remove(data dataToRemove)
{
for(data i : _list)
{
if(i.equals(dataToRemove))
{
_list.remove(i);
break;
}
}
}

有更好的方法吗?

最佳答案

一些评论:

  • 您的equals 方法不会覆盖Objectequals 方法(参数应该是对象 类型,而不是数据 类型)。
  • 您应该改进您的 equals 方法以解决空值等问题。
  • 最后,当您覆盖 equals() 时,您也应该覆盖 hashcode() - 否则您可能会在使用 Sets 或 Maps 时遇到一些奇怪的行为。

如果您正确地覆盖了 equals 方法,那么您就可以只使用 remove 方法。请参阅下面由 Netbeans 生成的自动生成的 equalshashcode,修改为使用 equalsIgnoreCase 方法。

public static void main(String[] args) {
List<Data> list = new ArrayList<Data>();
list.add(new Data("a", "b"));
list.add(new Data("a", "c"));
System.out.println(list.size()); //2
list.remove(new Data("A", "b"));
System.out.println(list.size()); //1
}

public static class Data {

public String a;
public String b;

public Data(String a, String b) {
this.a = a;
this.b = b;
}

@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final Data other = (Data) obj;
boolean sameA = (this.a == other.a) || (this.a != null && this.a.equalsIgnoreCase(other.a));
if (!sameA) return false;
boolean sameB = (this.b == other.b) || (this.b != null && this.b.equalsIgnoreCase(other.b));
if (!sameB) return false;
return true;
}

@Override
public int hashCode() {
int hash = 3;
hash = 89 * hash + (this.a == null ? 0 :this.a.toUpperCase().hashCode());
hash = 89 * hash + (this.b == null ? 0 : this.b.toUpperCase().hashCode());
return hash;
}

}

关于java - 从 java 列表中删除相同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com