Java 删除2个ArrayList之间的下部元素

Java 删除2个ArrayList之间的下部元素,java,arraylist,Java,Arraylist,我有一段代码,它比较两个数组列表,删除下斜边并返回它 public static GeometricShape removeLowerHypotenuse(ArrayList<GeometricShape> left, ArrayList<GeometricShape> right) { GeometricShape x = null; if(((RightTriangle)right.get(0)).getHypotenuse() < ((Righ

我有一段代码,它比较两个数组列表,删除下斜边并返回它

public static GeometricShape removeLowerHypotenuse(ArrayList<GeometricShape> left, ArrayList<GeometricShape> right) {
    GeometricShape x = null;
    if(((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
        x = right.get(0);
        right.remove(0);
    }
    if(((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
        x = left.get(0);
        left.remove(0);
    }
    if(right.size() != 0 && left.size() == 0) {
        x = right.get(0);
    }
    if(right.size() == 0 && left.size() != 0) {
        x = left.get(0);
    }
    if(right.size() == 0 && left.size() == 0) {
        return left.get(0);
    }
    return x;
}
公共静态几何图形删除斜边(ArrayList左,ArrayList右){
几何图形x=null;
如果(((直角三角形)right.get(0)).get斜边()<((直角三角形)left.get(0)).get斜边()&&right.size()!=0&&left.size()!=0){
x=right.get(0);
对。删除(0);
}
如果(((直角三角形)left.get(0)).get斜边()<((直角三角形)right.get(0)).get斜边()&&right.size()!=0&&left.size()!=0){
x=左。获取(0);
左。移除(0);
}
if(right.size()!=0&&left.size()=0){
x=right.get(0);
}
if(right.size()=0&&left.size()!=0){
x=左。获取(0);
}
if(right.size()==0&&left.size()==0){
向左返回。获取(0);
}
返回x;
}

当两个ArrayList的大小都为1(每个数组中有1个元素)时,我会得到一个越界异常,并弄不明白为什么会这样。我看不出我的代码中缺少了什么。

你需要使用
else if()
而不是
if()
来实现这一点,就像这样:

if(right.size() != 0 && left.size() == 0) {
    x = right.get(0);
}
else if(right.size() == 0 && left.size() == 0) {
    x =  left.get(0);
}
else if(right.size() == 0 && left.size() != 0) {
    x = left.get(0);
}
else if(((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
    x = right.get(0);
    right.remove(0);
}
else if(((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
    x = left.get(0);
    left.remove(0);
}
if(right.size()!=0&&left.size()=0){
x=right.get(0);
}
else if(right.size()==0&&left.size()==0){
x=左。获取(0);
}
else if(right.size()=0&&left.size()!=0){
x=左。获取(0);
}
如果(((RightTriangle)right.get(0)).get斜边()<((RightTriangle)left.get(0)).get斜边()&&right.size()!=0&&left.size()!=0){
x=right.get(0);
对。删除(0);
}
如果((RightTriangle)left.get(0)).get斜边()<((RightTriangle)right.get(0)).get斜边()&&right.size()!=0&&left.size()!=0){
x=左。获取(0);
左。移除(0);
}
在代码中,如果ArrayList
right
有一个元素,并且如果第一个
if()
大小写为true,则将删除
right
的第一个元素,使其保持为null

在随后的
if()
语句中,当调用
right.get(0)
时,抛出
IndexOutOfBoundsException

因此,您应该使用else if语句

另外,如果其中一个ArrayList为空,那么根据您的代码,在第一个if语句中,将抛出一个
IndexOutOfBoundsException
。因此,我重新安排了一些条件


希望有帮助

当您获得IndexOutOfBoundsException时,这意味着您正试图使用其值大于列表大小的索引值从列表中访问对象。在使用列表、数组时,您始终需要注意这一点

在您的情况下,如果执行了从右侧列表中删除对象的条件,则当您的第一次时将发生索引自动边界异常

当两个列表大小都为1并且您从右侧列表中删除了一个对象时,右侧列表的大小变为0。在你的下一个条件下,如果你正在尝试这个

RightTriangle)right.get(0)).getHypotenuse() 当有的大小时,列表为0。所以在索引0的列表中没有任何内容 这就是您在代码中获得IndexOutOfBoundsException的原因

在对列表执行任何操作之前,请先更改条件并检查大小,如下所示

public static GeometricShape removeLowerHypotenuse(ArrayList<GeometricShape> left, ArrayList<GeometricShape> right) {
        GeometricShape x = null;
        if(right.size() != 0 && left.size() != 0 && ((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse()  ) {
            x = right.get(0);
            right.remove(0);
        }
        if(right.size() != 0 && left.size() != 0 && ((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() ) {
            x = left.get(0);
            left.remove(0);
        }
        if(right.size() != 0 && left.size() == 0) {
            x = right.get(0);
        }
        if(right.size() == 0 && left.size() != 0) {
            x = left.get(0);
        }
        if(right.size() == 0 && left.size() == 0) {
            return left.get(0);
        }
        return x;
    }
公共静态几何图形删除斜边(ArrayList左,ArrayList右){
几何图形x=null;
如果(right.size()!=0&&left.size()!=0&((直角三角形)right.get(0)).get斜边()<((直角三角形)left.get(0)).get斜边(){
x=right.get(0);
对。删除(0);
}
如果(right.size()!=0&&left.size()!=0&((RightTriangle)left.get(0)).get斜边()<((RightTriangle)right.get(0)).get斜边(){
x=左。获取(0);
左。移除(0);
}
if(right.size()!=0&&left.size()=0){
x=right.get(0);
}
if(right.size()=0&&left.size()!=0){
x=左。获取(0);
}
if(right.size()==0&&left.size()==0){
向左返回。获取(0);
}
返回x;
}

尽管如此,使用此代码仍将获得IndexOutOfBoundsException,就像您试图从空列表中访问的最后一个条件一样。如果您在尝试获取索引0处的元素后检查了大小,则需要在最后一个条件中更改此代码。首先检查大小,因为您只关心第一个元素,所以可以使用
isEmpty()
而不是
size()
。如果两个列表的大小都为0,那么这将在第二个列表中引发IndexOutOfBoundsException谢谢。我认为这是因为一旦大小为0,就会抛出一个错误,但我没有意识到顺序造成了差异。