LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【C#】如何從List集合中刪除對象

admin
2021年3月10日 9:10 本文熱度 3464

這個問題看似好像挺簡單挺幼稚的,然而就這個幼稚的問題還曾經困擾過我一陣呢,其實犯這個錯誤的根本緣由是咱們對于基礎知識的理解和掌握上還有不足的表現,基本功有些人老是以為不重要,認為更多的擴大學習的廣度才是最重要的,我認為這是很容易犯的,同時也是很致命的錯誤觀點!java

對基礎知識掌握不牢靠,或理解不深入,寫出的代碼必然會有40%的幾率是錯誤的、低效的,一段代碼不是說沒有編譯錯誤就必定是對的,不是說簡單的運行下就必定是對的,優秀的代碼,是經得起“刀山火海”般的考驗的(“多線程、效率、安全”這三坐大山)。編程

因此重要性,我就再也不強調了,相信說完后,地球人都能懂個人意思,那么下面就來看看這個有趣的現象吧。安全

先看看以下代碼:多線程

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestList {
	void init(List<Integer> list) {
		list.clear();
		for (int i = 0; i < 10; i++) {
			list.add(i + 1);
		}
	}
	void remove(List<Integer> list) {
		for (int i = 0; i < 5; i++) {
			list.remove(i);
		}
	}
	void removeTwo(List<Integer> list) {
		for (int i : list) {
			if (i < 6) {
				list.remove(i);
			}
		}
	}
	void removeThree(List<Integer> list) {
		for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) {
			int i = iter.next();
			if (i < 6) {
				iter.remove();
			}
		}
	}
	public static void main(String[] args) {
		TestList testList = new TestList();
		List<Integer> list = new ArrayList<Integer>();
		// 第一種方法
		testList.init(list);
		testList.remove(list);
		System.out.println(list);
		// 第二種方法
		try {
			testList.init(list);
			testList.removeTwo(list);
			System.out.println(list);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// 第三種方法
		testList.init(list);
		testList.removeThree(list);
		System.out.println(list);
	}
}

運行的結果以下:學習

[2, 4, 6, 8, 10]spa

java.util.ConcurrentModificationException線程

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)code

at java.util.AbstractList$Itr.next(AbstractList.java:343)orm

at com.TestList.removeTwo(TestList.java:23)對象

at com.TestList.main(TestList.java:60)

[6, 7, 8, 9, 10]

上面代碼邏輯很簡單,就是將List集合里的前5個對象刪除掉,然而結果倒是至關不同:第一個是錯誤的結果,第二個直接報異常,只有第三個是咱們想要的結果!


那么這是為何呢?其實主要緣由來自于List中的remove()方法。咱們來分析一下:

第一種方法:

第一次執行完remove方法后,并不像咱們簡單想象的那樣就把第一個刪除了,“1”這個對象被刪除了沒錯,可是當被刪除后List中“2”之后的9個對象的index索引也變了,都比原來的值減一,換句話說就是剩下的9個對象的index值為從0到8,而不是原來的從1到9了,那么第二次執行remove方法時,此時list.remove(1)刪除的就是“3”這個對象(“3”的index值為1),而不是咱們想象的刪除“2”對象。


第二種方法:

緣由跟上面同樣,致使List的next()方法內部出現modCount和expectedModCount不一致致使拋出異常。


因此咱們這里建議你們采用第三種方法來刪除List集合中某一個對象,這樣作是最簡單且容易記憶的。那第一種方法和第二種方法有沒有解決的辦法呢?目前我知道第一種方法的解決辦法,第二種應該是無解的(由于語法結構致使)。


第一種方法的改進措施:

void remove(List<Integer> list) {
		int num = list.size() - 5;
		for (int i = 0; i < num; i++) {
			list.remove(i);
			i--;
			num--;
		}
	}

我想你編程時間長了,也會偶爾遇到這些相似簡單卻讓你頭疼的問題,遇到這些問題首先檢查下本身的邏輯是否有問題,若是邏輯沒有問題就檢查下代碼的結構是否有問題吧,這就是所謂的基本功,之后我也會慢慢的增強鞏固本身基本功方面的能力,一塊兒加油吧。


該文章在 2021/3/10 9:10:04 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
五月婷日韩中文字幕中文字幕 | 一区二区在线观看免费 | 在线精品国精品91 | 最新肉丝袜福利在线观看 | 亚洲h成年动漫在线观看不卡 | 中文字幕在线观看第一页 |