第9篇 Java中的集合(Map)


Java中的Map接口

Map接口的定義:public interface Map<K,V>

很明顯這是個泛型接口,而且接受的是兩個參數:K、V。K代表的是Key,V代表Value。Map存放的是一系列的鍵值對,每個鍵都映射到一個值上。

Map接口要注意的幾點:

  • 一個鍵只能映射到一個值
  • 不能包含重復的鍵
  • Map的結構是無序的,不能夠通過下標來訪問

Map 接口提供三種collection 視圖,允許以鍵集(keySet)、值集(values)或鍵-值映射關系集(entrySet)的形式查看某個映射的內容。

keySet視圖:Set<K> keySet()

該方法返回一個Set集合,類型為Map鍵的類型K。該 set 受映射支持,也就是說,當我們更改set鍵集時,原hashMap也會受到相同的更改,這是非常可怕的一點。

當我們要對hashMap進行遍歷時,可通過該方法來獲取hashMap的鍵集合,從而通過迭代器來對鍵進行遍歷以獲取Map中存放的值。

//獲取鍵集並遍歷獲取值
Set keySets = hashMap.keySet();
for (Object key : keySets) {
    hashMap.get(key);
}
獲取鍵集並遍歷獲取值

 values視圖:Collection<V> values()

返回此映射中包含的值的 Collection 視圖。該 collection 受映射支持,跟上面的Set相同,在我們改變某個值的時候,hashMap也會受到影響。在僅需要知道值而忽略鍵的遍歷時可以用到該方法。遍歷方式同樣是使用迭代器(加強for循環)。

entrySet視圖:Set<Map.Entry<K,V>> entrySet()

這是Map中最重要的一個視圖,它返回的是鍵值對的set集合,就是說set中的每一個元素都是一個Map中的鍵值對。該 set 受映射支持。

entrySet返回一個Set<Map.Entry<K,V>>集合,集合中元素類型為Map.Entry類型,這是Map接口中的一個內部接口,在Map的實現類如HashMap等有其實現類,代表着Map中的一個個節點。

entrySet中的方法:

  • getKey() 返回與此項對應的鍵。
  • getValue() 返回與此項對應的值。
  • setValue(V value) 用指定的值替換與此項對應的值。

Map其他的一些常用方法:

  • containsKey(Object key) 判斷Map中是否包含該鍵
  • containsValue(Object value) 判斷Map中是否存在該value
  • get(Object key) 通過鍵來獲取其在Map中映射的值
  • put(K key, V value) 添加鍵值對,如果該鍵已存在的話,將把原有值覆蓋
  • putAll(Map<? extends K,? extends V> m) 添加Map對象中的所有鍵值對
  • remove(Object key) 通過鍵移除映射關系
  • size() 獲取Map中存在的鍵值對數量

Map的常用實現類

HashMap:結構是哈希表,其存放的數據是無序的,通過哈希值和equals來對元素進行比較。

TreeMap: 底層結構為二叉樹,存放時將元素進行排序。對於沒有實現比較算法的對象,需要在構造TreeMap時傳入一個該對象的Comparator比較器或讓該對象實現Comparable接口。具體實現與TreeSet相同。

思考:如何將一串字符串中的每個字母出現次數存入字典,並找出第一個出現兩次的字母

我這里采用hashMap來實現,首先我們要將字母次數加入Map中,字母作為鍵,出現次數作為值:

HashMap<Character, Integer> hmc = new HashMap();        
for (char c : str.toCharArray()) {
    //如果該字母已存在於Map中,則將其次數(值)加一,否則添加該鍵,值為1
    if (hmc.containsKey(c)) {                
        int count = hmc.get(c);
        hmc.put(c, ++count);
    } else {
        hmc.put(c, 1);                
    }
}

其次我們需要找到值為2的鍵值對,獲取該鍵值對的鍵(字母)在字符串中第一次出現的位置(indexOf),並通過一個中間變量來存儲。接着我們以打擂台的形式取得第一次出現位置最小的鍵,就是我們要找的那個字母啦:

Set set = hmc.entrySet();    //獲取鍵值對集
int index = -1;    //要找的字母的位置
for (Object object : set) {
    Entry node = (Entry)object;        //鍵值對集中的元素,即Entry節點
    char key = (char) node.getKey();    //獲取鍵(字母)            
    if((int)node.getValue()==2) {
        int num = str.indexOf(key);        //該鍵(字母)在字符串中第一次出現的位置
        if(index==-1 || str.indexOf(key)<index){    //打擂台,誰小取誰
            index = str.indexOf(key);            
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM