自定義Map集合,將重複的鍵值對不進行覆蓋而是進行疊加

止梧昂發表於2020-11-06

在我java基礎中寫過的一個串聯性的小遊戲中,自定義一個賬戶類,主要需要用到的是身份證號,這個是唯一標識,隨機生成的卡號,密碼,賬戶餘額,將所有的物件儲存在ArrayList中,現在需要統計所有賬戶的餘額,並且將這些餘額排序,需求的重點是這些一個人會有多個賬戶,這些賬戶的唯一的相同點是開戶人的身份證號,然後將所有身份證號相同的賬戶的餘額加起來,並進行排序

自定義一個Map集合,並繼承HashMap,在這個類中重寫空構造方法,加入一個比較器模型

//重寫空構造方法,加入比較器模型
	public MyMap(Comparator<Account> comparator) {		
	}
	
	//自定義put方法,
	public Double put(K Key,Double value) {
		//將傳入的value方法賦值給一個變數
		Double newV = value;
		//如果這個map中有key這個鍵值對
		if(containsKey(Key)) {
			//通過get方法取出原始的value值
			Double oldV=get(Key);
			//將原始的value值和傳入的value相加賦值給新的value
			newV = oldV + newV;
		}
		//呼叫hashMap的put方法,返回鍵值對為key和新value的元素
		return super.put(Key, newV);
	}

賬戶已經存在了ArrayList型別的list物件中,將這些物件轉存到自定義的map中

//給所有賬戶餘額排序
	public HashMap sortMoney() {
		//根據身份證號查詢所有的賬戶
		MyMap<String> map = new MyMap<String>(new Comparator<Account>() {
			
			//實現Comparator的比較方法,方法體根據你要進行的比較規則自定義
			@Override
			public int compare(Account o1, Account o2) {
				//首先將餘額進行比較,餘額一樣,呼叫String的compareTo方法對PersonId進行比較
				int flag = (int) (o1.getBalance() - o2.getBalance());
				return flag == 0?o1.getPersonId().compareTo(o2.getPersonId()):flag;
			}
			
		});
		//呼叫自定義map的自定義put方法,將list中相同PersonId的所有賬戶中的餘額加起來,放到map中的一個鍵值對中
		for(int i=0;i<list.size();i++) {
			map.put(list.get(i).getPersonId(), list.get(i).getBalance());			
		}
		//返回自定義的map
		return map;
	}

測試類:

	System.out.println("所有賬戶餘額是(按財產降序):");
	//定義一個map集合接收排序方法傳來的集合物件
	HashMap<String,Double> map = bank.sortMoney();
	//通過foreach迴圈遍歷map
	for(String col:map.keySet()) {
		//通過key值找出對應的value值
		Double add = map.get(col);
		//列印輸出鍵值對
		System.out.println("賬戶所有人的身份證號是:"+col+",名下的財產是:"+add);
	}

相關文章