2014-02-05 93 views
2

有一個ArrayList<Integer> al,我想將其前半部分複製到另一個ArrayList<Integer> firstHalf。 (如果al有奇數個元素,則firstHalf應該有一個元素。)但是,下面的代碼會拋出IndexOutOfBoundsException,並且說Index: 0, Size: 0,但我不確定這會是一個問題,因爲ArrayLists的索引啓動在0.另外,我知道.arraycopy,但我想這樣做,用for-loops。複製ArrayList的前半部分

int x = al.size()/2 + (al.size()%2) - 1; 
for(int i = 0; i < x; i++){ 
    firstHalf.set(i, al.get(i)); 
} 
+2

考慮使用'subList'。 –

+1

@SotiriosDelimanolis注意:'subList()'返回原始列表的「視圖」,而不是副本。所以你需要像'firstHalf = new ArrayList(al.subList(0,newSize));' – millimoose

回答

6

您應該使用add而不是set

int x = al.size()/2 + (al.size()%2) - 1; 
for(int i = 0; i < x; i++){ 
    firstHalf.add(al.get(i)); 
} 

這將是更好地使用List#subList

+0

啊,謝謝你,我忘了這件事。但是,我想知道爲什麼'.set'不起作用? – javaChipFrapp

+2

@howAnAngel_Dies_要使用'set',你的列表不能爲空。如果你做'firstHalf.set(0,something)',並且你的列表是空的,那麼索引'0'處的元素不存在,所以它不能被設置。 – BackSlash

+1

@howAnAngel_Dies_ [「**替換**元素在指定元素的列表中的指定位置。「](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int,%20E))由Javadoc讀給你的委員會帶給你。 – millimoose

7

List#subList正是適用於這一目的。

int chunkSize = al.size() % 2 == 0 ? al.size()/2 : (al.size()/2) + 1; 
List<Integer> firstHalf = al.subList(0, chunkSize); 

有兩種情況考慮:

  • 即使:如果大小爲偶數,則n/2是正確的大小由大塊。
  • 奇數:如果大小是奇數,那麼您需要在奇數長度列表的結果中加1以得到中間值。
+0

你確定最後一句話嗎?給「from」和「to」索引時的慣例是「to」索引是**獨佔**。 (更重要的是,Javadoc說這是獨家。) – millimoose

+0

好的。不太清楚我在那裏想什麼。在該值的末尾添加1應該糾正該問題。 – Makoto

+0

現在你打破了它與偶數個元素的列表。 Spoiler:'((al.size()+ 1)/ 2) - 1',如果你*有聰明的模塊化算術,而不是隻加一個if。 – millimoose

1

另一種方法:

List<Integer> firstHalf = al.subList(0, al.size()/2 + (al.size()%2) - 1); 
0
List<Integer> firstHalf = al.subList(0, (int) al.size()/2 + 1); 

是對al.size()/ 2更容易轉換成整數比做 「2%」。

您添加1到firstHalf將比下半部分大。

相關問題