我在使用removeDuplicate()方法时遇到麻烦

时间:2018-07-24 02:31:26

标签: java arraylist duplicates shape

我的代码看起来正确,但是当我运行它时,它有一个bug(ArrayIndexOutOfBound)。

my Main method:

    public static void main(String[] args) {

    Diagram d1 = new Diagram();
    Layer l1 = new Layer();
    Shape s1 = new Triangle(3, 4, 5);
    Shape s2 = new Circle(10);
    Shape s3 = new Triangle(3, 4, 5);
    Shape s4 = new Rectangle(10, 5);
    l1.layers.add(s1);
    l1.layers.add(s2);
    l1.layers.add(s3);
    l1.layers.add(s4);
    d1.diagrams.add(l1);

//        l1.deleteTriangle();
//        System.out.println(l1.layers.get(0));

    l1.deleteDuplicate();
    System.out.println(l1.layers);

当我尝试注释六角形和形状零件时,我的代码构建成功,但是删除了我的大部分形状

1 个答案:

答案 0 :(得分:0)

根据您对“相同形状”的定义,解决此问题的更有条理的方法可能是在每个“形状”子类中覆盖equals()(和hashCode())。

使用Triangle类的示例。

public class Triangle extends Shape {
    // The normal triangle stuff

    @Override
    public int hashCode() {
        int ret = getA();
        ret *= 31;
        ret += getB();
        ret *= 31;
        ret += getC();
        return ret;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Triangle other = (Triangle) obj;

        return getA() == other.getA() &&
               getB() == other.getB() &&
               getC() == other.getC();
    }
}

要获取没有重复项的新列表(组):

List<Shape> shapes = Arrays.asList(new Triangle(3, 4, 5), new Triangle(4, 4, 5), new Triangle(3, 4, 5));

Set<Shape> shapesWithoutDuplicates = new HashSet<>(shapes);

仅当具有相同尺寸的三角形为“相等”时,才应执行 这是自然的操作。如果三角形也是在同一位置绘制的,那么如果只是“自然相等”,那么这种特殊的消除“重复项”的尝试将是一种特殊的一次性情况。

使用您的原始方法,您会得到异常,因为您尝试在删除某些内容后进行评估。

请参见Delete data from ArrayList with a For-loop