Java 删除二维ArrayList中的重复项
我在删除二维ArrayList中的多个条目时遇到问题。 我有一个名为“Wall”的类,它包含一个带有整数的ArrayList。 现在我有了一个“Wall”的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
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)