我在删除二维ArrayList中的多个条目时遇到问题。 我有一个名为“Wall”的类,它包含一个带有整数的ArrayList。 现在我有一个“Wall”的ArrayList,其中大多数都包含相同的整数。 我改变了我的结构,因此不再可能使用HashSet来解决我的问题。
就像:
public ArrayList<Wall> listOfWalls = new ArrayList<Wall>();
//The Class:
public class Wall {
private ArrayList<Squares> dots = new ArrayList<Squares>();
每个Square对象都包含一个特定的数字。
长话短说:
我的ArrayList< ArrayList< Squares>>
包含大约40个相同的列表,但如果删除双打,则只剩下5个。我想要这5个条目。
规格:
之前的输出(缩短)(大小:6):
552
553
554
552
553
554
552
553
554
600
601
602
600
601
602
600
601
602
期望的结果(大小:2):
552
553
554
600
601
602
答案 0 :(得分:1)
如果您不想要重复,则必须使用Set
代替List
。例如:
Set<Wall> walls = new HashSet<>();
您还必须通过实施hashCode
和equals
方法来定义哪些墙是相同的。在这种情况下,如果它们具有相同的正方形,则两个墙是相等的:
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;
}
}
请记住,不再定义两个集合中元素的顺序。如果您的代码取决于特定顺序,则必须使用LinkedHashSet
代替HashSet
。
如果您需要列表语义,则可以使用set only temporary仅删除重复项:
List<Wall> walls = ...
Set<Wall> uniqueWalls = new HashSet<>(walls);
walls = new ArrayList<>(uniqueWalls)
编辑:编辑你的equals-Method,你写了x == s.y而不是x == s.x,现在它工作正常