简单的Map集合练习题
需求:
/*** 給定["a", "b", "a", "b", "c", "a", "b", "c", "b"]字符串?dāng)?shù)組,* 然后使用Map的key來保存數(shù)組中字符串元素,value保存該字符串元素的出現(xiàn)次數(shù)* 最后統(tǒng)計出各字符串元素的出現(xiàn)次數(shù)。*/思路:
看到計算出現(xiàn)次數(shù)這種需求,我們就需要想到判重,如何將一個字符串里的元素找出出現(xiàn)的次數(shù)
for循環(huán)遍歷數(shù)組再裝入Map數(shù)組里
Map接口實(shí)現(xiàn)類常用的方法:
Map接口實(shí)現(xiàn)類的方法都是關(guān)于鍵值對的操作
-
put(key,value) 向集合中添加元素
-
get(key) 根據(jù)鍵對象找到值對象
-
keySet() 得到鍵對象的集合
-
values() 得到值對象的集合
-
remave(key) 根據(jù)鍵對象移除整個元素
-
containsKey(key) 判斷鍵對象在集合中是否存在
方法1代碼:
String[] str = {"a", "b", "a", "b", "c", "a", "b", "c", "b"};Map<String, Integer> map = new HashMap();for (int i = 0; i < str.length; i++) {int count = 0;for (int j = 0; j < str.length; j++) {if (str[i].equals(str[j])) {count++;}}map.put(str[i], count);}System.out.println(map);方法1代碼總結(jié):
簡單的雙for循環(huán)遍歷數(shù)組,當(dāng)重復(fù)時計數(shù),這種計數(shù)并添加進(jìn)Map集合,以外循環(huán)數(shù)組里的元素挨著去問自己的每一個元素,是你嗎,是你就+1,不是你就下一個。例如:
str里的a問了9個元素一遍后把自己出現(xiàn)的次數(shù)和自己(a)添加進(jìn)了Map集合,等到第2個a去問的時候,毫無疑問是同樣的出現(xiàn)次數(shù),再把自己(a)和自己出現(xiàn)的次數(shù)添加Map集合,第三個也如此。這里觸及到一個基礎(chǔ)知識點(diǎn):
Map接口當(dāng)中,鍵對象和值對象可以是任何類的實(shí)例,鍵不可以重復(fù),值可以重復(fù)。
所以需求是將Map的key(鍵值)來保存數(shù)組中字符串元素,而不是將出現(xiàn)的次數(shù)放到鍵值(key)。
第一次put,map的值是{"a","3"},第二次還是{"a","3"}。。。一直覆蓋到最后的count值。
我們可以得知:用這種自身元素有重復(fù)的數(shù)組來遍歷自身判重時,數(shù)據(jù)量大的話效率會很低
由此我們可以借助另一個概念來解決這種循環(huán)次數(shù)太多的問題,Set和List之間的轉(zhuǎn)換。
這里又涉及到一個基礎(chǔ)知識點(diǎn):
Set和List的區(qū)別之一,List集合可以存儲一列數(shù)據(jù),數(shù)據(jù)內(nèi)容可以重復(fù),以元素安插的次序來方式元素,不會重新排列。而Set接口實(shí)現(xiàn)類,利用元素的hashCode和equals方法,判斷集合中元素是否重復(fù)。如果希望按元素的屬性值去除重復(fù)數(shù)據(jù),需要重寫hashCode和equals方法
我們根據(jù)這個概念可以j將List轉(zhuǎn)為Set,Set只會保留去重后的集合,我們就可以實(shí)現(xiàn)第二種方法
方法二代碼:
String[] str = {"a", "b", "a", "b", "c", "a", "b", "c", "b"};Map<Object, Integer> map = new HashMap();List list = Arrays.asList(str);Set set = new HashSet(list);for (Object item : set) {int count = 0;for (int i = 0; i < list.size(); i++) {if (item.equals(list.get(i))) {count++;}}map.put(item, count);}System.out.println(map);方法二代碼總結(jié):
對比代碼一,在面對數(shù)據(jù)量大的情況時,通過Set和List之間的轉(zhuǎn)換,我們可以得到去除重復(fù)后的集合,再用同等方式來進(jìn)行判重,效率遠(yuǎn)高于方法1
方法三代碼:
String[] str = {"a", "b", "a", "b", "c", "a", "b", "c", "b"};Map<String, Integer> map = new HashMap();for (int i = 0; i < str.length; i++) {if (map.containsKey(str[i])) {int v = map.get(str[i]);map.put(str[i], ++v);} else {map.put(str[i], 1);}}System.out.println(map);方法三代碼總結(jié):
這個方法和上方倆個方法的思路完全不同,直接遍歷數(shù)組,在放進(jìn)Map集合中是,判斷Map集合中的鍵值是否有重復(fù)的,最重要的一步是else,當(dāng)?shù)谝淮伪闅vMap時,在Map集合里是沒有鍵值得,所以進(jìn)入else賦值第一個鍵值和count次數(shù)
最后是輸出結(jié)果:
{a=3, b=4, c=2}(本文為接觸Java不久的菜鳥所寫,如有誤區(qū),還望各位大佬在評論區(qū)多多指教,菜鳥虛心受教)
總結(jié)
以上是生活随笔為你收集整理的简单的Map集合练习题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米线刷/救砖简易教程
- 下一篇: 社交网络影响力最大化基础知识总结