1. 程式人生 > >Java基礎學習之Map練習

Java基礎學習之Map練習

在學習Map時做了一道有意思的練習題,在這裡記錄一下。
題目的大概意思是:
輸入任意一串字串,如aaabbbccsghedkok,統計字串中每一個字元出現的次數,輸出結果的形式為:a(1)b(2)…。

思路:
字母和次數之間存在對映關係,所以使用map進行儲存。輸出的字母之間是有順序的,所以採用TreeMap(這裡補充一下知識點:Map介面的實現類有兩種:HashMap和TreeMap。HashMap的底層資料結構為雜湊表,能夠保證元素的唯一性。TreeMap的底層資料結構是二叉樹,不僅能保證元素的唯一性,還可以進行排序)。
步驟:

  1. 因為操作的是字串的字母,所以先將字串變成字元陣列;
  2. 遍歷字元陣列,用每一個字母作為鍵去查Map集合的表
    如果字母鍵不存在,就將該字母作為鍵 1作為值儲存到Map中
    如果該字母鍵存在,就將該字母鍵對應的值取出再加1,再將該字母和對應的值儲存到Map集合中。鍵相同值會覆蓋。
  3. 遍歷結束,Map集合中已經儲存了對映關係。

儲存的時候結果長度是可變的,所以不採用String,採用StringBuilder.

程式碼如下:

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class Test1 {
	public static void main(String[] args) {

		String str="aaabbbccsghedkok";
		String s=getCharCount(str);
		System.out.println(s);
		
	}

	private static String getCharCount(String str) {
		//1.將字串變成字元陣列
		char[] chs=str.toCharArray();
		//2.建立一個map集合
		Map<Character, Integer> map=new TreeMap<Character, Integer>();  //Map<char,int>這樣是不對的,因為char與int是資料型別,而不是物件型別,所以用其包裝類
		//3.遍歷
		for(int i=0;i<chs.length;i++){
			if(!(chs[i]>='a' && chs[i]<='z')){
				continue;   //如果不是字母則跳過
			}
			//如果傳進來的鍵沒有對應的值,則返回null
			//將陣列中的字母作為鍵去查詢map表
			Integer value=map.get(chs[i]);
			/*int count=1;
			//判斷是否為空
			if(value!=null){
				count=value+1;
			}
			map.put(chs[i], count);*/
			if(value==null){
				map.put(chs[i],1);   //字母第一次出現map中沒有記錄,所以輸出為null,第一次出現設定count為1
			}else{
				map.put(chs[i],value+1);
			}
		}
		return maptoString(map);//輸出
	}

	private static String maptoString(Map<Character, Integer> map) {
		StringBuilder sb=new StringBuilder();
		
		Iterator<Character>  iterator=map.keySet().iterator();
		
		while(iterator.hasNext()){
			Character key=iterator.next();
			Integer value=map.get(key);
			sb.append(key+"("+value+")");
			
		}
		return sb.toString();
	}

}