簡體   English   中英

需要從ArrayLists的ArrayList中刪除元素<Double>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM