Java 删除二维ArrayList中的重复项

Java 删除二维ArrayList中的重复项,java,arraylist,hashset,Java,Arraylist,Hashset,我在删除二维ArrayList中的多个条目时遇到问题。 我有一个名为“Wall”的类,它包含一个带有整数的ArrayList。 现在我有了一个“Wall”的ArrayList,其中大多数都包含相同的整数。 我改变了我的结构,所以不再可能使用哈希集来解决我的问题 这就像: public ArrayList<Wall> listOfWalls = new ArrayList<Wall>(); //The Class: public class Wall { p

我在删除二维ArrayList中的多个条目时遇到问题。 我有一个名为“Wall”的类,它包含一个带有整数的ArrayList。 现在我有了一个“Wall”的ArrayList,其中大多数都包含相同的整数。 我改变了我的结构,所以不再可能使用哈希集来解决我的问题

这就像:

public ArrayList<Wall> listOfWalls   = new ArrayList<Wall>();


  //The Class:


public class Wall {
private ArrayList<Squares> dots = new ArrayList<Squares>();
预期结果(尺寸:2):


如果不希望有重复项,则必须使用
Set
而不是
List
。例如:

Set<Wall> walls = new HashSet<>();
如果两个正方形具有相同的坐标,则它们相等:

class Squares {
    int x,y;

    @Override
    public boolean equals(Object obj) {
        Squares s = (Squares)obj;
        return x==s.x && y==s.y;
    }

    @Override
    public int hashCode() {
        return 1000*y+x;
    }
}
请记住,两个集合中元素的顺序不再定义。如果代码取决于特定顺序,则必须使用
LinkedHashSet
而不是
HashSet

如果需要列表语义,可以使用set only temporary删除重复项:

List<Wall> walls = ...
Set<Wall> uniqueWalls = new HashSet<>(walls);
walls = new ArrayList<>(uniqueWalls)
列表墙=。。。
设置唯一墙=新哈希集(墙);
墙=新阵列列表(唯一墙)

编辑:编辑你的equals方法,你写了x==s.y而不是x==s.x,现在它工作得很好

从你发布的代码来看,看起来你有一个ArrayList,但在最后一句话中,你说你有一个ArrayList。您使用的是哪种构造?您有一个
Wall
的实例列表,其中一些墙是相同的。您想删除这些。对吗?为什么不能使用
HashSet
?ArrayList在类墙中。首先,我使用ArrayList listOfWalls,但出于附件的原因,我将结构更改为ArrayList,每个对象都有一个ArrayList。对不起,我正在编辑它now@Banthar:这是正确的,但我不知道如何检查类Wall中的ArrayList是否相同。问题是我需要它作为ArrayList来具有get()之类的方法。我如何处理覆盖的hashCode()方法?当使用上面的代码时,它只检查下一面墙是否相同。您不直接调用
hashCode
equals
。HashSet在内部使用它们。如果您仍然有问题,请向我们展示更完整的代码示例-带有示例输入和预期输出。我不确定我是否正确理解结构。使用临时解决方案时,大小为0。我想我做错了什么。。我用ArrayList而不是刚才检查的集合覆盖equals()方法,如果我的listofWalls的索引0和索引1相同。事实上,两者的值都是-609055629。尽管如此,即使使用上面的临时解决方案,仍然存在重复项。我一直在为所有垃圾邮件进行担心,有趣的观察:listofWalls.get(0)和listofWalls.get(1)的哈希代码为-609055629,但listofWalls.get(0).equals(listofWalls.get(1)为false。这是怎么回事?
class Wall {

    private final Set<Squares> dots = new HashSet<>();

    @Override
    public boolean equals(Object obj) {
        return dots.equals(((Wall)obj).dots);
    }
    @Override
    public int hashCode() {
        return dots.hashCode();
    }
}
class Squares {
    int x,y;

    @Override
    public boolean equals(Object obj) {
        Squares s = (Squares)obj;
        return x==s.x && y==s.y;
    }

    @Override
    public int hashCode() {
        return 1000*y+x;
    }
}
List<Wall> walls = ...
Set<Wall> uniqueWalls = new HashSet<>(walls);
walls = new ArrayList<>(uniqueWalls)