2017-04-10 90 views
-1

我試圖刪除所有與外圍12的三角形的元素,我設置了一個if語句來檢查三角形對象的所有外圍從數組列表中用for循環。元素不被IF語句識別

我的問題是當我運行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 
+0

不確定這是否是問題的一部分。但是我會避免'ShapeList.remove(i);'在循環'ShapeList'時。例如,請參閱[這裏](http://stackoverflow.com/questions/10738634/delete-data-from-arraylist-with-a-for-loop)。 – jrook

+0

'ShapeList.get(23)'是第24個元素。 – Holloway

+1

'java.lang.IndexOutOfBoundsException:索引:23,大小:23' - 索引是從零開始的。大小爲23的數組沒有索引23,只有0-22。 – David

回答

3

你的問題是ArrayList中得到了減小大小在每個循環
例如,如果arrayList的大小是23,下一個循環在這種情況下是22 ere沒有23的索引,我建議你通過iterator迭代arrayList,或者做一個反向循環,以最後一個以第一個索引結尾的索引開始

+0

我更新了代碼,因爲我意識到這是一個問題,但我的問題仍然存在,仍然存在的元素,應該現在編輯。 –

+0

你迭代迭代器嗎? 你做了一個反向循環? 我沒有看到任何更新的問題:/對不起 –

+0

向後循環將是你的最佳途徑:) –

1

您是否還刪除了一些圈?

似乎正在發生的事情是,每次從列表中刪除一個形狀時,就會「跳過」下一個。從列表中刪除一個元素時,將所有後續元素的索引減1。所以如果你刪除了元素22,那麼下一個元素new index是22,但你最終用一個簡單的for循環來擦除它。

你可以做的是:

  1. 更改對迭代(從更高索引爲0)

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

  • 向後走重新創建包含要保留的元素的新形狀列表,然後丟棄舊列表
  • 更新:我重讀了你的代碼,當你不得不刪除連續的兩個實體時,你的問題就出現了。您可以在上一個三角形之前移除最大的圓,以便在增加索引時跳過它。 我同意Basil Battikhi的命令for循環將是一個完美的適合您的問題!

    +0

    會爲每個循環足夠嗎? –

    +0

    我不確定,但我認爲Java不喜歡每個循環內部刪除元素編輯:它會引發一個ConcurrentModificationException –

    +0

    在一個循環中刪除元素向上導致java不太好,倒退做了招。謝謝 –

    0

    問題是使用數組後刪除您的元素正在向左移動,因此您的索引i在每次刪除後都跳過1個值: 刪除此列表中指定位置的元素。將任何隨後的元素向左移(從其索引中減去一個元素)。欲瞭解更多信息,請查看javadoc。 你可以很容易地製作每個不需要的元素位置/索引的另一個列表,並在之後刪除它們。