2010-03-05 61 views
2

我想從ArrayList中刪除一個int []。 由於我的代碼,我只有值,所以我創建數組,然後調用remove();從ArrayList中刪除int [] <int[]>

int[] pos = new int[]{0,1}; 
positionList.remove(pos); 

positionList是corrisponding ArrayList的

這實際上是行不通的。是否有另一種可能性,不是通過列表迭代像

for (int[] pos : positionList) { 
    if (posX == pos[0] && posY == pos[1]) { 
    positionList.remove(pos); 
    break; 
    } 
} 

回答

7

縱觀posXposY,我很好奇,如果像ArrayList<Point>對你是一個更好的解決方案。

remove找不到陣列的原因是因爲新陣列不是equals到已經在集合中的陣列。

(new int[0]).equals(new int[0]) // false! 

如果你創建你自己的Point類,那麼你可以@Override equals的行爲,只要你想,你可以簡單地調用remove(new Point(posX, posY))

你也應該考慮有Set<Point> positionList代替,因爲實現(TreeSetO(1)HashSetO(log N))提供了更快的去除。如果您想使用TreeSet或需要在其他上下文中對點進行排序,請記住@Override hashCode(如果您使用@Override equals,您必須執行此操作),並且使Point implements Comparable<Point>(或提供外部Comparator<Point>)。

如果您int[]有許多元素和自定義Point類是不適用的,那麼你可能要考慮切換到List<Integer>代替(參見:有效的Java第二版,第25項:寧願名單陣列)。它具有您需要的equals行爲。速度較慢,但​​速度可能仍然很快。

最後,如果您堅持使用int[],您可以將其包裝在您自己的IntArray類中,並使用ArrayList<IntArray>代替。 @Override equalshashCode分別使用Arrays.equals(int[], int[])hashCode(int[])

+1

+1使用,而不是一個列表的HashSet的建議。 ArrayList當然是ad hoc刪除的最低效的集合。 – 2010-03-05 17:04:31

+0

是的,我試圖在我的回答中以遞增的方式涵蓋所有相關基礎。 – polygenelubricants 2010-03-05 17:06:35

+1

+1這麼多級別。 – 2010-03-05 17:17:23

7

從字面上看,使用數組來保存不是一系列項目的數據是一種不好的做法。

你的數組實際上是一個擁有兩個不同域的數據持有者。 定義座標類並覆蓋Object.equals(Object)。然後,你的代碼會變得更加乾淨:

ArrayList<MyPoint> positionList; 
// fill list 
MyPoint testPos = new MyPoint(0, 1); 
positionList.remove(testPos); 

你應該猜測如何定義MyPoint ..

+0

或更好,請使用JDK中實際的Point2D或Point類,http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D。html – basszero 2010-03-05 17:04:41

+2

不要忘記重寫Object#hashCode()了! http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – 2010-03-05 17:19:09

+0

Point2D有兩個問題。首先它是抽象的,所以Dimitri無論如何都需要寫一個類。其次它使用雙打,而迪米特里使用整數.. 我的一般觀點是使用數據結構,而不是數組。 – 2010-03-05 19:42:27