【问题标题】:Element not being recognised by IF statementIF 语句无法识别元素
【发布时间】:2017-09-05 05:15:18
【问题描述】:

我正在尝试删除所有周长为 12 的三角形元素,我设置了一个 if 语句以使用 for 循环从数组列表中检查三角形对象的所有周长。

我的问题是,当我运行 for 循环时,它会删除所有周长等于 12 的三角形,但最后一个三角形仍会显示在输出中。

代码:

double smallestTriangle = 0.0;
double biggestCircle = 0.0;

/*for loops to get the smallest triangle(12) and largest circle(63.xx)*/

for(int i = 0; i < ShapeList.size(); i++) {
    if (ShapeList.get(i).getClass().getName() == "Triangle") {
        System.out.println(ShapeList.get(i));
        System.out.println(ShapeList.get(i).getPerimeter() + " - " + smallestTriangle);
        if (ShapeList.get(i).getPerimeter() == smallestTriangle) {
            ShapeList.remove(i);
            System.out.println("REMOVED!");
        }
    }
    if (ShapeList.get(i).getClass().getName() == "Circle") {
        if (ShapeList.get(i).getPerimeter() == biggestCircle) {
            ShapeList.remove(i);
        }
    }
}

输出:

Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0
12.0 - 12.0
REMOVED!
Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0
12.0 - 12.0
REMOVED!
Triangle {a=4.9 b=5.0 c=8.9} perimeter = 18.8
18.8 - 12.0
Triangle {a=3.1 b=4.1 c=5.1} perimeter = 12.299999999999999
12.299999999999999 - 12.0
Triangle {a=4.0 b=5.0 c=6.0} perimeter = 15.0
15.0 - 12.0
Triangle {a=3.1 b=4.0 c=5.0} perimeter = 12.1
12.1 - 12.0
Triangle {a=3.9 b=4.8 c=5.7} perimeter = 14.399999999999999
14.399999999999999 - 12.0
Circle {r=1.0} perimeter = 6.283185307179586
Circle {r=2.111} perimeter = 13.263804183456108
Circle {r=1.1} perimeter = 6.911503837897546
Triangle {a=3.9 b=4.0 c=5.9} perimeter = 13.8
Square {l=3.0} perimeter = 12.0
Rectangle {l=3.0 w=5.1} perimeter = 16.2
Square {l=5.0} perimeter = 20.0
Triangle {a=4.9 b=5.0 c=8.9} perimeter = 18.8
Rectangle {l=8.0 w=2.1} perimeter = 20.2
Circle {r=3.8} perimeter = 23.876104167282428
Triangle {a=3.1 b=4.1 c=5.1} perimeter = 12.299999999999999
Triangle {a=4.0 b=5.0 c=6.0} perimeter = 15.0
Rectangle {l=3.1 w=5.2} perimeter = 16.6
Circle {r=10.0} perimeter = 62.83185307179586
Triangle {a=3.1 b=4.0 c=5.0} perimeter = 12.1
Circle {r=2.0} perimeter = 12.566370614359172
Circle {r=3.0} perimeter = 18.84955592153876
Rectangle {l=3.0 w=5.2} perimeter = 16.4
Square {l=100.1} perimeter = 400.4
Square {l=100.2} perimeter = 400.8
Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0 // <- not getting removed
Triangle {a=3.9 b=4.8 c=5.7} perimeter = 14.399999999999999

数组列表:

Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0
Circle {r=1.0} perimeter = 6.283185307179586
Circle {r=2.111} perimeter = 13.263804183456108
Circle {r=1.1} perimeter = 6.911503837897546
Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0
Triangle {a=3.9 b=4.0 c=5.9} perimeter = 13.8
Square {l=3.0} perimeter = 12.0
Rectangle {l=3.0 w=5.1} perimeter = 16.2
Square {l=5.0} perimeter = 20.0
Triangle {a=4.9 b=5.0 c=8.9} perimeter = 18.8
Rectangle {l=8.0 w=2.1} perimeter = 20.2
Circle {r=3.8} perimeter = 23.876104167282428
Triangle {a=3.1 b=4.1 c=5.1} perimeter = 12.299999999999999
Triangle {a=4.0 b=5.0 c=6.0} perimeter = 15.0
Rectangle {l=3.1 w=5.2} perimeter = 16.6
Circle {r=10.0} perimeter = 62.83185307179586
Triangle {a=3.1 b=4.0 c=5.0} perimeter = 12.1
Circle {r=2.0} perimeter = 12.566370614359172
Circle {r=3.0} perimeter = 18.84955592153876
Rectangle {l=3.0 w=5.2} perimeter = 16.4
Square {l=100.1} perimeter = 400.4
Square {l=100.2} perimeter = 400.8
Circle {r=10.1} perimeter = 63.46017160251382
Triangle {a=3.0 b=4.0 c=5.0} perimeter = 12.0 //this element isn't getting removed
Triangle {a=3.9 b=4.8 c=5.7} perimeter = 14.399999999999999

【问题讨论】:

  • 不确定这是否是问题的一部分。但是我会在循环 ShapeList 时避免 ShapeList.remove(i); 。例如,请参阅here。
  • ShapeList.get(23) 是第 24 个元素。
  • java.lang.IndexOutOfBoundsException: Index: 23, Size: 23 - 索引从零开始。大小为 23 的数组没有索引 23,只有 0-22。
  • arraylist 有 25 项。我猜remove() 删除了两个元素,因此,当索引达到 23 时,抛出异常。
  • 好吧,我改变了我的例子;即使我使用 i 循环代码,周长为 12 的三角形仍然存在。

标签: java arrays


【解决方案1】:

您的问题是 arrayList 在每个循环中都减小了大小
例如,如果 arrayList 大小为 23,则下一个循环将是 22,在这种情况下,没有 23 的索引,我建议您在 iterator 上迭代 arrayList 或从最后一个索引开始向后循环,以第一个索引

【讨论】:

  • 我更新了代码,因为我意识到这是一个问题,但我的问题仍然存在,元素仍然存在,现在应该编辑。
  • 您是否通过 iterator 对其进行了迭代?你做了一个向后循环吗?我没有看到这个问题的任何更新:/抱歉
  • 向后循环将是您的最佳方式:)
  • 我通过调试模式运行它,但我不明白为什么它没有被删除,因为在调试中它说 if 语句是真的,这可能是一个 ide 错误吗?
  • 不,调试工作正常,但正如我告诉你的,如果你删除一个元素,arrayList 将在每个循环中减小 size-1,如果你使用后向循环,那么发生率将不能更改,例如 arrayList has {1,3,5,6,7} 7 的索引是 4 但是如果你确实删除了像 3 这样的元素,7 的索引将是 3 而不是 4
【解决方案2】:

你是否也删除了一些圈子?

似乎正在发生的事情是,每次从列表中删除一个形状时,都会“跳过”下一个形状。从列表中删除一个元素时,会将所有后续元素的索引减一。所以如果你删除元素 22,那么下一个元素的新索引是 22,但你最终会用一个简单的 for 循环跳过它。

你可以做的是:

  1. 将您更改为向后迭代(从较高的索引到 0)

for(int i = ShapeList.size() - 1; i &gt;=0 ; i--) {...}

  1. 重新创建包含要保留的元素的新形状列表,然后丢弃旧列表

更新:我重新阅读了您的代码,并且当您必须连续删除两个实体时,我非常确信您的问题存在。您在最后一个三角形之前删除了最大的圆圈,因此在增加索引时会跳过它。 我同意 Basil Battikhi 的观点,即循环的反向顺序将非常适合您的问题!

【讨论】:

  • for-each 循环是否足够?
  • 我不确定,但我认为 java 不喜欢在每个循环中删除元素编辑:它会引发 ConcurrentModificationException
  • 是的,在循环中删除元素向上犯罪并没有很好地使用 java,倒退就可以了。谢谢你
【解决方案3】:

问题是,在使用数组删除后,您的元素会向左移动,因此每次删除后您的索引 i 都会跳过 1 个值: 删除此列表中指定位置的元素。将任何后续元素向左移动(从它们的索引中减去一个)。有关详细信息,请查看javadoc。 您可以轻松地创建另一个列表,其中包含每个不需要的元素位置/索引,然后将它们删除。

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 2012-03-02
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多