删除二维ArrayList中的重复条目

时间:2014-11-02 21:03:01

标签: java arraylist hashset

我在删除二维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

1 个答案:

答案 0 :(得分:1)

如果您不想要重复,则必须使用Set代替List。例如:

Set<Wall> walls = new HashSet<>();

您还必须通过实施hashCodeequals方法来定义哪些墙是相同的。在这种情况下,如果它们具有相同的正方形,则两个墙是相等的:

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,现在它工作正常