------- android培训、java培训、期待与您交流! ----------
学习总结
Map集合(映射)
该集合存储键值对,一对对存,也称为双列集合。map集合中必须保证键的唯一性。
常用方法:
1、添加
value put(key,value):返回前一个和key关联的值,如果没有返回null。
2、删除
void clear():清空map集合。
value remove(Object key):根据指定的key删除这个键值对,返回删除的值。
3、判断
boolean containsKey(key);
boolean containsValue(value);
boolean isEmpty();
4、获取
value get(key):通过键获取值,如果没有该键返回null。
int size():获取键值对个数。
Collection<V> values() 获取map集合中的所有值,返回Collection集合。
注意:put方法,添加元素时出现相同的键。那么后添加的值会覆盖原有键对应的值,并返回被覆盖的值。
add方法是collection体系中的添加方法;append方法是字符串缓冲区StringBuffer和StringBuilder中的,注意不要混淆= =
Map主要体系:
1.Hashtable 底层是哈希表,不可以存入null键null值,是线程同步的
2.HashMap 底层是哈希表,允许使用null键null值,不同步
3.TreeMap 底层是二叉树,线程不同步,可用于给map集合中的键进行排序(注意——>只能是键)
Map集合的特殊取出方式
1.Set<k> keySet方法
将map中所有的键存入到Set集合。因为set集合具备迭代器。可以用迭代方式取出所有的键,再用get方法,获取每一个键对应的值。(map没有迭代器)
2,Set<Map.Entry<k,v>> entrySet方法
将map集合中的映射关系存入到了set集合中,而该关系的数据类型就是:Map.Entry,然后可通过Map.Entry中的getKey和getValue方法获取键和值。
知识点介绍完了,结合点例子吧
练习:"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2).....
思路:字符对应次数,那么就可以分别作为键和值存入map中
通过字母作为键去map中找值,存在值就+1,不存在就将字母和值1存入
按格式输出map的键值对
import java.util.*;
class MapTest
{
public static void main(String[] args)
{
String s= charCount("sdfgzxcvasdfxcvdf");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();//将字符串变为字符数组
//最后输出的字符为自然顺序,so用TreeMap——>对键排序
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
int count = 0;//记录字符出现次数
for(int x=0; x<chs.length; x++)
{
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;//获取字母出现的次数,非字母就跳过
Integer value = tm.get(chs[x]);//通过键查值
if(value!=null)
count = value;
count++;//值存在,计数加1;不存在,值变为1
tm.put(chs[x],count);//直接往map集合中存储字母和数字(自动装箱变为对应引用型)
count = 0;//计数要重置,不会影响下个字符
}
StringBuilder sb = new StringBuilder();
//通过entrySet取出map集合的键值对
Set<Map.Entry<Character,Integer>> es = tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it = es.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> m = it.next();
Character ch = m.getKey();
Integer value = m.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();//通过字符串缓冲区打印
}
}
P.S.
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))continue;
上述实现了不统计非字母字符,刚开始我就没想到这么做,后来看了视频资料后才想到= =