2013-09-25 169 views
1

我的目標是讓用戶輸入數字N,並且arrayList的大小爲2N + 1.如何在一個對象中填充一個arrayList的一半,並在java中填充另一個對象?

最終,我的arrayList對於N = 2應該是「OO XX」。

public Board(int size) 
    { 
     tiles = new ArrayList<Tile>(size); 

     for(int index = 0; index < size; index++) 
     { 
      tiles.add(new Tile('O')); 
      tiles.add(new Tile(' ')); 
      tiles.add(new Tile('X')); 

      System.out.print(tiles.get(index)); 
     }   

    } 

上面的代碼給了我「O XO」。 如何修改它以顯示OO XX?

謝謝!

+0

如果N = 2,那麼大小將是2N + 1 = 5。它永遠不會是「OOO XXX」,即7個瓷磚,但會在5個瓷磚「O XO」 – hrv

+0

後終止,您的問題與您的示例不符。對於N = 2,2N + 1是5,因此結果將是「OO XX」而不是「OOO XXX」。 – djb

回答

1

試試這個:

// it's not necessary to specify the initial capacity, 
// but this is the correct way to do it for this problem 
tiles = new ArrayList<Tile>(2*size + 1); 

// first add all the 'O' 
for (int index = 0; index < size; index++) 
    tiles.add(new Tile('O')); 
// add the ' ' 
tiles.add(new Tile(' ')); 
// finally add all the 'X' 
for (int index = 0; index < size; index++) 
    tiles.add(new Tile('X')); 

// verify the result, for size=2 
System.out.println(tiles); 
=> [O, O, , X, X] 
+0

使用N人不是大小 – hasan83

+4

@hasan參數被稱爲'大小',而不是'N' –

+0

你的代碼是錯誤的將只填寫x1的一半用你的ur替換os int用第二個循環的第一個循環 – hasan83

1

tiles的初始化就好,但其餘的邏輯需要一些工作。

for(int index = 0; index < size; index++) { 
    tiles.add(new Tile('O')); 
} 
tiles.add(new Tile(' ')); 
for (int index = 0; index < size; index++) { 
    tiles.add(new Tile('X')); 
} 

或者,如果你覺得自己是可愛......

tiles.addAll(Collections.nCopies(size, new Tile('O'))); 
tiles.add(new Tile(' ')); 
tiles.addAll(Collections.nCopies(size, new Tile('X'))); 

...但如果你希望以後修改Tile對象版本可能是一個問題。

+1

使用N人不是尺寸 – hasan83

+0

add:tiles = new ArrayList (2 * size + 1); 並考慮使用Singleton模式(僅爲'O',''和'X'中的每一個創建一個Tile – djb

+0

@djb:第一行已經在OP的帖子中,並且OP沒有提供是否「Tile」作爲一個單身人士是可變的或安全的,我一直堅持OP的明確期望和要求,包括使用OP的'size'變量,@hasan。 –

4

如果你想這樣做在一個循環中,你可以做這樣的:

for (int i = 0 ; i != 2*size+1 ; i++) { 
    tiles.add(new Tile(i==size ? ' ' : (i<size ? 'O' : 'X'))); 
} 

的想法是計算總規模(這是2*size+1),然後用條件來決定我們的中點的哪一邊。

+0

'''三元<3''' – Cruncher

+3

不尋常的使用'!='而不是標準的'''。會變成負面大小的無限循環。 –

+1

...請不要這樣做?原則上將此陷入一個單一的循環是很好的,但這種方式是不可讀的。 –

2

您在one-arg ArrayList(int) constructor中傳遞的參數不是列表的固定大小。這只是初始能力。如果你的尺寸是固定,那麼你可以使用一個數組:

Tile[] tiles = new Tile[2 * n + 1]; 

然後填充數組是非常簡單的,通過使用Arrays#fill(Object[] a, int fromIndex, int toIndex, Object val)方法:

Arrays.fill(tiles, 0, n, new Tile('O')); 
tiles[n] = new Tile(' '); 
Arrays.fill(tiles, (n + 1), (2 * n + 1), new Tile('X')); 

雖然在評論中指出,這將參考相同的對象填充數組索引。可能會與不可變的Tile一起工作,但不會與可變的一起工作。

+0

在具有初始容量的ArrayList上使用數組有什麼優勢?這些操作沒有任何緩慢,陣列中已經有了他需要的空間 – Cruncher

+0

這不會是僅僅引用三個tile對象來填充整個數組嗎?另一方面,如果'Tile'是不可變的,那麼將會是預期的效果... – dasblinkenlight

+0

@dasblinkenlight。嗯。其實是對的。以某種方式錯過了那部分。 –

相關問題