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

キキジ*_*キジキ 3 java collections

我有一个项目列表,其中每个项目都是一个包含2个公共字符串的简单类.我有一个equals方法,只使用两个字符串的equalsIgnoreCase methot.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

现在我这样做:

public void remove(data dataToRemove)
{
    for(data i : _list)
    {
        if(i.equals(dataToRemove))
        {
            _list.remove(i);
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

ass*_*ias 15

一些评论:

  • 您的equals方法不会覆盖equals方法Object(参数应该是Object类型,而不是data类型).
  • 你应该改进你的equals方法来计算空值等.
  • 最后,hashcode()当你覆盖时你也应该覆盖equals()- 如果不是,你可能会在使用集合或地图时遇到一些奇怪的行为.

如果您正确覆盖该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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @assylias:如果覆盖`equals()`,覆盖`hashCode()`不仅仅是好习惯,这是这些方法的契约所要求的.虽然`list`之类的非基于哈希的集合可能表现正确,即使`hashCode()`未被正确覆盖,但其他数据结构也不会. (2认同)