[英]Need to remove elements from an ArrayList of ArrayLists<Double>
我有處理wav文件的代碼,並將雙精度值(音頻樣本)的集合排序到ArrayList中,然后將每個ArrayLists排序到ArrayLists的ArrayList中:
ArrayList<Double> sampleEvent = new ArrayList<Double>();
ArrayList<ArrayList<Double>> EventsCollect = new ArrayList<ArrayList<Double>>();
我有代碼嘗試從集合中刪除小於特定大小的ArrayList。
但是,它似乎所做的只是列表的一半,並且不會從集合中刪除正確的ArrayList。
請在下面查看我的代碼:
for (int loop = 0 ; loop < EventsCollect.size(); loop++) {
if ( EventsCollect.get(loop).size() < 200000) {
EventsCollect.remove(loop);
}
}
完成此操作后,ArrayList將保留在集合中,大小僅為三位數。
任何有關如何糾正此問題的建議將不勝感激。
您的問題是即使刪除元素,您也會增加循環計數器。 這樣,您可以跳過循環中的元素。 只需更改您的if語句:
int loop = 0; // loop counter
while (loop < EventsCollect.size()) {
if (EventsCollect.get(loop).size() < 200000) {
EventsCollect.remove(loop);
}
else
loop++;
}
或者您可以向后遍歷ArrayList:
for (int i = EventsCollect.size() - 1; i >= 0; i --){
if (EventsCollect.get(i).size() > 200000)
EventsCollect.remove(i);
}
之所以可行,是因為您將始終在數組中循環一定的時間。 如果查看代碼,則在刪除元素時EventsCollect.size()
發生變化,因此不會循環遍歷每個元素。 這應該是您提示出問題的提示。
在Java 8中,您可以嘗試使用lambda表達式刪除謂詞
EventsCollect = EventsCollect.stream()
//we want to retain only samples with more than 200_000 count
.filter(sampleEvent -> sampleEvent.size() >= 200_000)
//we collect everything that we want back into our EventsCollect list
.collect(Collectors.toList());
作為旁注,您可能想將EventsCollect重命名為eventsCollect(小寫字母e)。
無論如何,只對一半的條目進行評估的原因是,當您刪除一個條目時,所有底部的內容都會上移一個。 這樣的效果是將不會評估新轉移的條目的第一項。
假設我們有4個條目,而我當前為1(指向100k)
{230k, 100k, 20k, 122k}
循環求值並刪除100k
{230, 20k, 122k}
現在所有值都上移了一個,而i則增加到了2(指向122k)。 請注意,20k位於1的位置,現在被跳過。 循環將評估並刪除122k。
{230, 20k}
為了用最少的更改來修復代碼,您需要進行反向迭代(從最后一個條目到第一個條目)
for (int loop = EventsCollect.size()-1 ; loop >=0; loop--) {
if ( EventsCollect.get(loop).size() < 200000) {
EventsCollect.remove(loop);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.