java map存取重複值、幼兒園分班問題、map按key自動排序問題

weixin_41621233發表於2018-10-24

8.童心幼兒園開學了,有一些適齡兒童入學,請設計一個分大班(6),中班(4-5),小班(2-3)的程式, 並在測試類中將結果輸出出來

package $10_22;
	/**
	 * @desc 8.童心幼兒園開學了,有一些適齡兒童入學,請設計一個分大班(6),中班(4-5),小班(2-3)的程式,
	 * 並在測試類中將結果輸出出來
	 * 思路:按年齡排序,然後多路決策分別存入三個容器中
	 * @param args
	 */
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
/**
 * 
 * @desc 	重寫map中的put實現當key重複時將新value追加到舊value後面
 * @author user
 *
 */
class mymap extends HashMap<Integer, String>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public String put(Integer key, String value) {
		Set<Integer> keys = this.keySet();
		for (Integer integer : keys) {
			if (key.equals(integer)) {//判斷出key值相同
				String jiuValue = this.get(integer);//取出舊value
				value=jiuValue+","+value;//拼接
				break;
			}
		}
		return super.put(key, value);//返回撥用父類
	}
}

class youErYuan {

	public static void main(String[] args) {
		//建立map容器,key為年齡,value為姓名
//		Map<Integer,String> map=new HashMap<Integer, String>();
		mymap map = new mymap();
		map.put(1, "一歲小哥");
		map.put(3, "李四");
		map.put(5, "李六");
		map.put(4, "李七");
		map.put(3, "李八");
		map.put(2, "李九");
		map.put(6, "李六");
		map.put(3, "李十");
		map.put(2, "張三");
		map.put(4, "王五");
		//列印輸出結果
		Set<Integer> keys0 = map.keySet();
		for (Integer integer : keys0) {
			System.out.print("key=="+integer+"\t");
			System.out.println("value=="+map.get(integer));
		}
		System.out.println("------------------------");

		//list套map自定義比較器排序
		/**
		ArrayList<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
		Collections.sort(list,new Comparator<Map<Integer, String>>() {

			@Override
			public int compare(Map<Integer, String> o1, Map<Integer, String> o2) {
				return 0;
			}
		});
		*/
		//entryset()自動排序
		Set<Entry<Integer, String>> keys = map.entrySet();
		//結果展示
		for (Entry<Integer, String> entry : keys) {
			System.out.print("key=="+entry.getKey()+"\tvalue=="+entry.getValue()+"\n");
		}
		System.out.println("---------------------------------");
		//建立大中小三個班級並統計班級人數
		List<String> xiaoBan=new ArrayList<String>();
		int xiaoBanren=0;
		List<String> zhongBan=new ArrayList<String>();
		int zhongBanren=0;
		List<String> daBan=new ArrayList<String>();
		int daBanren=0;
		String regex="[,]";
		for (Integer integer : keys0) {
			String[] ren = map.get(integer).split(regex);//正規表示式分割歲數相同的name
			int renShu=ren.length;//統計歲數相同的個數
			
			if (integer>=2 && integer<=3) {
				xiaoBanren+=renShu;//小班班級人數統計
				for (int i = 0; i < renShu; i++) {
					xiaoBan.add(ren[i]);
				}
			}else if (integer>=4 && integer<=5) {
				zhongBanren+=renShu;
				for (int i = 0; i < renShu; i++) {
					zhongBan.add(ren[i]);
				}
			}else if (integer==6) {
				daBanren+=renShu;
				for (int i = 0; i < renShu; i++) {
					daBan.add(ren[i]);
				}
			}else {
				System.out.println(map.get(integer)+"\t歲數不符合要求,無法分配班級");
			}
		}
		System.out.println("小班人數有"+xiaoBanren);
		System.out.println("中班人數有"+zhongBanren);
		System.out.println("大班人數有"+daBanren);
	}

}

結果
key==1	value==一歲小哥
key==2	value==李九,張三
key==3	value==李四,李八,李十
key==4	value==李七,王五
key==5	value==李六
key==6	value==李六
------------------------
key==1	value==一歲小哥
key==2	value==李九,張三
key==3	value==李四,李八,李十
key==4	value==李七,王五
key==5	value==李六
key==6	value==李六
---------------------------------
一歲小哥	歲數不符合要求,無法分配班級
小班人數有5
中班人數有3
大班人數有1

本來想著把年齡和姓名關聯起來,然後按年齡排序把姓名分到不同的班。然鵝,map存值相同key值,新value會把就vale頂替。百度一下,大都為重寫map的hashCode()和equals()方法。發現看不太懂。看了這位老哥寫的:?
迫於無奈想到重寫put方法.程式碼如上

重寫put在儲存之前加判斷,判斷之前是否存在相同key,存在就取出其value將其與新value組合,然後呼叫父類方法寫入。取出時string.split(regex)分割出不同value.此方法只適用於string型別value
後來還要排序分組,但是發現已經拍好,研究
key為integer

	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		map.put(7, "saodjf");
		map.put(3, "Iuadh");
		map.put(4, "sdfask");
		map.put(1,"sdhfka");
		Set<Integer> keys = map.keySet();
		for (Integer integer : keys) {
			System.out.println("key=="+integer+"\tvalue=="+map.get(integer));
		}
key==1	value==sdhfka
key==3	value==Iuadh
key==4	value==sdfask
key==7	value==saodjf

key為char型別

	public static void main(String[] args) {
		HashMap<Character, String> map = new HashMap<Character, String>();
		map.put('d', "sdhfa");map.put('r', "adfas");map.put('s', "sdjflkajs");
		map.put('e', "");
		Set<Character> keys = map.keySet();
		for (Character character : keys) {
			System.out.println("key=="+character+"\tvalue"+map.get(character));
		}
key==d	valuesdhfa
key==e	value
key==s	valuesdjflkajs
key==r	valueadfas

key為string型別

	public static void main(String[] args) {
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("a", "我是1");map.put("s", "我是2");map.put("g", "我是3");
		map.put("h", "我是4");map.put("v", "我是5");
		Set<String> keys = map.keySet();
		for (String string : keys) {
			System.out.println("key=="+string+"\tvalue=="+map.get(string));
		}
key==v	value==我是5
key==g	value==我是3
key==s	value==我是2
key==a	value==我是1
key==h	value==我是4

string型別無自動排序。為撒嘞

相關文章