我的代码看起来正确,但是当我运行它时,它有一个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);
当我尝试注释六角形和形状零件时,我的代码构建成功,但是删除了我的大部分形状
答案 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);
仅当具有相同尺寸的三角形为“相等”时,才应执行 这是自然的操作。如果三角形也是在同一位置绘制的,那么如果只是“自然相等”,那么这种特殊的消除“重复项”的尝试将是一种特殊的一次性情况。
使用您的原始方法,您会得到异常,因为您尝试在删除某些内容后进行评估。