2011-01-11 84 views
1

存在我需要添加到網格而沒有收到IndexOutOfBoundsException的對象列表。每個對象都有兩個與之關聯的數字,它與網格中的indexcolumn位置相對應。可以有3列和無限的行。我需要調用add()方法,該網格但只有在正確的順序,因此:Java中的排序循環

(0,0),(0,1),(0,2),(1,0)...

因此

網格是這樣的:

0 1 2 
0 x x x 
1 x x x 
2 x x x 
3 x x x 

我還必須考慮到,沒有對象存在一定的地位的機會。例如:

A) x x x B) x x C) x x x 
    x x x  x x  x x 
    x x   x  x 
    x x   x  x 
    x x 

可以這樣做嗎?我不知道從哪裏開始。

+0

每[這個問題](http://stackoverflow.com/questions/416266/sorted-collection-in-java),你可能要考慮[PriorityQueue中( http://download.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html)。 OTOH,如果列表中的項目數量不太可能太多,您可能需要考慮[插入排序](http://en.wikipedia.org/wiki/Insertion_sort)。 – GreenMatt

+0

我不明白整個「排序」主題在哪裏發揮作用。它在你的問題標題和標籤中,但不在你的問題本身。 –

回答

3

也許你應該考慮另一個存儲對象的數據結構(行,列)。它的界面看起來像

public interface GridModel { 
    void set(int row, int column, Object o); 
    Object get(int row, int column) 
} 

而且你可以使用列表來存儲數據。 List<List<Object>>,或者如Mark Peters所示,稀疏矩陣

如果使用單元格值很重要,請添加單元格迭代器方法。簡單的執行如下所示:

public Iterable<Object> cellIterator() { 
    final List<Object> items = new java.util.ArrayList<Object>(); 
    for(final List<Object> row : cells) { 
     for(final Object cell: row) { 
      items.add(cell); 
     } 
    } 
    return items; 
} 
+0

如果所有數據都遵循OP示例(A,B和C)中的模式,在給定列中填充索引中沒有空位,則列表列表是更好的數據結構。 –

3

你在找什麼可能是sparse matrix的實現。

這個最簡單的實現之一就是字典鍵方法,它基本上是一個將座標鏈接到對象的表。事情是這樣的:

Map<Point, T> grid = new HashMap<Point, T>(); 
grid.put(new Point(5, 2), myObj); 

Point將是您實現包含columnindex領域,具有hashCode()equals()正確實施的一類。或者,如果你真的很懶,你可以通過使用java.awt.Point來破解它。

您可以將其封裝在類似於@sblundy建議的界面中。我建議這樣的事情:

public interface Grid<T> { 
    public T set(int column, int index, T val); 
    public T get(int column, int index); 
    //other optional methods 
} 
+0

'Point'類在哪裏發揮作用?我會循環'HashMap.entryset()',它會按順序嗎? – Federer

+0

@BlueMalc:它將用於存儲和檢索對象。它不會對迭代密鑰做任何保證。你沒有在你的帖子中提到過這樣的內容。 –