摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續循環了刪除后立馬終端循環,會正常跳出,但代價是不能繼續向后循環了使用迭代器使用迭代器可,正確無誤的刪除,代碼簡潔優雅,推薦使用使用迭代器可,正確無誤的刪除注意這里時而不是
在工作中的許多場景下,我們都會使用到List這個數據結構,那么同樣的有很多場景下需要刪除List中的某一個元素或某幾個元素,那么我們該如何正確無誤地刪除List中的元素的,今天我來教大家三種方式。
前提知識準備 for循環的執行順序這里借用百度百科的一張圖,簡明扼要的介紹一下
Iterator介紹迭代器:迭代其實我們可以簡單地理解為遍歷,是一個標準化遍歷各類容器里面的所有對象的方法類,它是一個很典型的設計模式。Iterator 模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向每次遍歷前都需要知道要遍歷集合的內部結構。
// 遍歷list List list = new ArrayList(); list.add(1); list.add(2); for (int i = 0; i < list.size(); i++) { Object object = list.get(i); // do something } // 遍歷map Mapmap = new HashMap<>(); map.put("1","first"); map.put("2","second"); for (Map.Entry entry : map.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); // do something }
對于這兩種方式,我們總是都事先知道集合的內部結構,訪問代碼和集合本身是緊密耦合的,無法將訪問邏輯從集合類和遍歷方法中分離出來。同時每一種集合對應一種遍歷方法,代碼無法復用。
為了解決以上問題, Iterator 模式騰空出世,它總是用同一種邏輯來遍歷集合。使得需要遍歷集合的人,在遍歷的時候不需要了解集合的內部結構,所有的內部狀態都由 Iterator 來維護。遍歷集合的方法不直接和集合類打交道,它總是控制 Iterator,向它發送”向前”,”向后”,”取當前元素”的命令,就可以間接遍歷整個集合。
直接使用簡單for循環,以for (int i = 0; i < list.size(); i++) 進行遍歷,這種方式可能會在遍歷的過程中漏掉部分元素,從而出現少刪的情況。
/** * 通過簡單的遍歷方式,在遍歷的過程中有可能會漏掉元素 * 取第二個元素i=1時,滿足條件被刪掉,原有的數組的第三個元素,變成了新數組的第二個元素 * i++后i=2,但i=2指向的是新數組中的第三個元素,那么原數組中的第三個元素就被漏掉了 * * @param list * @param element * @return */ public static List forRemove(List list, Object element) { for (int i = 0; i < list.size(); i++) { if (element.equals(list.get(i))) { list.remove(i); } } return list; }增強for循環,刪除后不退出
使用增強for循環是,如果刪除后繼續向下循環則會報java.util.ConcurrentModificationException
/** * 使用增強for循環是,如果刪除后繼續向下循環則會報 * java.util.ConcurrentModificationException * * @param list * @param element * @return */ public static List forceForRemove(List list, Object element) { for (Object item : list) { if (item.equals(element)) { list.remove(item); } } return list; }
異常如下:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.lingyejun.leetcode.RemoveListElement.forceForRemove(RemoveListElement.java:57) at com.lingyejun.leetcode.RemoveListElement.main(RemoveListElement.java:112)三種正確方式 逆向循環遍歷
我們使用逆向遍歷的方式可以得到正確的結果
/** * 逆向循環,是正確的 * 1-->2-->3-->4 * 逆向循環時,倒數第一個元素滿足條件被刪除時,i--后,原數組的倒數第二個變成了新數組的倒數第一個元素 * i = size-2指向新數組的最后一個元素,沒有漏掉。 * 同理倒數第二個元素滿足條件被刪除時,i--后,原數組的倒數第三個變成了新數組的倒數第二個元素 * i= size-3指向新數組的倒數第二個元素,也沒有漏掉 * * @param list * @param element * @return */ public static List reverseorRemove(List list, Object element) { for (int i = list.size() - 1; i >= 0; i--) { if (element.equals(list.get(i))) { list.remove(i); } } return list; }增強for循環刪除元素后break
使用增強for循環,刪除元素后,立即跳出,則正常退出,但缺點是不能向后繼續循環了。
/** * 刪除元素后,立即跳出,則正常退出,但不能向后繼續循環了 * * @param list * @param element * @return */ public static List forceForRemove1(List list, Object element) { for (Object item : list) { if (item.equals(element)) { // 刪除后立馬終端循環,會正常跳出,但代價是不能繼續向后循環了 list.remove(item); break; } } return list; }使用Iterator迭代器
使用迭代器可,正確無誤的刪除,代碼簡潔優雅,推薦使用!
/** * 使用迭代器可,正確無誤的刪除 * * @param list * @param element * @return */ public static List iteratorRemove(List list, Object element) { Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object cur = iterator.next(); if (cur.equals(element)) { // 注意?。?!這里時Iterator.remove()!!!而不是list.remove()!!! iterator.remove(); } } return list; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72514.html
摘要:用方法,刪除指定值的元素第一個匹配項。注意這些值都可以大于列表長度,不會報越界。列表生成式,以內整數的倍數生成器表達式結果結果結果結果結果本文原創并首發于微信公眾號貓,后臺回復愛學習,免費獲得本精選電子書。 千里之行,始于足下。要練成一雙洞悉一切的眼睛,還是得先把基本功扎扎實實地學好。今天,本喵帶大家仔細溫習一下Python的列表。溫故而知新,不亦說乎。 當然,溫習的同時也要發散思考,...
摘要:元組也支持內置函數的參數必須是一個序列字符串列表元組元組有什么用既然中有這么個數據結構,自然就有它的用武之地。 引言 想學爬蟲還是 python 專業啊,之前一直在用 java, 現在決定嘗嘗鮮,使用 python及爬蟲框架來完成網絡數據采集。編程語言之間都是相通的,比如都需要模塊化,引入其他文件來實現功能,使用列表等容器來處理數據,都要使用 json 或 xml 來解析和傳輸數據。你...
摘要:元組也支持內置函數的參數必須是一個序列字符串列表元組元組有什么用既然中有這么個數據結構,自然就有它的用武之地。 引言 想學爬蟲還是 python 專業啊,之前一直在用 java, 現在決定嘗嘗鮮,使用 python及爬蟲框架來完成網絡數據采集。編程語言之間都是相通的,比如都需要模塊化,引入其他文件來實現功能,使用列表等容器來處理數據,都要使用 json 或 xml 來解析和傳輸數據。你...
閱讀 933·2021-09-07 09:58
閱讀 1484·2021-09-07 09:58
閱讀 2869·2021-09-04 16:40
閱讀 2501·2019-08-30 15:55
閱讀 2404·2019-08-30 15:54
閱讀 1364·2019-08-30 15:52
閱讀 423·2019-08-30 10:49
閱讀 2598·2019-08-29 13:21