黑马程序员——Java编程语言学习总结 –Map集合

来源:互联网 发布:linux启动进入grub 编辑:程序博客网 时间:2024/05/16 14:41
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

        作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?

如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。

但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?

针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合Map。

一,Map集合

通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做

学号1         姓名1

学号2      姓名2

学号3         姓名3

学号2(不行) 姓名4

学号4     姓名4

1, Map集合的特点:

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

 

2, Map集合和Collection集合的区别?

Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对

Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)

 

注意:

Map集合的数据结构值针对键有效,跟值无关

HashMap,TreeMap等会讲。

Collection集合的数据结构是针对元素有效

3, Map集合的功能概述:

A:添加功能

V put(Kkey,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲

如果键是第一次存储,就直接存储元素,返回null

如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

B:删除功能

voidclear():移除所有的键值对元素

Vremove(Object key):根据键删除键值对元素,并把值返回

C:判断功能

booleancontainsKey(Object key):判断集合是否包含指定的键

booleancontainsValue(Object value):判断集合是否包含指定的值

booleanisEmpty():判断集合是否为空

D:获取功能

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

Vget(Object key):根据键获取值

Set<K>keySet():获取集合中所有键的集合

Collection<V>values():获取集合中所有值的集合

E:长度功能

int size():返回集合中的键值对的对数

 

4,Map集合的遍历

A:键找值

a:获取所有键的集合

b:遍历键的集合,得到每一个键

c:根据键到集合中去找值

 

B:键值对对象找键和值

a:获取所有的键值对对象的集合

b:遍历键值对对象的集合,获取每一个键值对对象

c:根据键值对对象去获取键和值

 

代码体现:

Map<String,String>hm = new HashMap<String,String>();

 

hm.put("it002","hello");

hm.put("it003","world");

hm.put("it001","java");

 

方式1 键找值

Set<String>set = hm.keySet();

for(Stringkey : set) {

Stringvalue = hm.get(key);

System.out.println(key+"---"+value);

}

 

方式2 键值对对象找键和值

Set<Map.Entry<String,String>>set2 = hm.entrySet();

for(Map.Entry<String,String>me : set2) {

String key= me.getKey();

Stringvalue = me.getValue();

System.out.println(key+"---"+value);

 

 

5,Map的子类

 

5.1, HashMap:是基于哈希表的Map接口实现。

哈希表的作用是用来保证键的唯一性的。

 

HashMap<String,String>

键:String

值:String

 

HashMap<Integer,String>

键:Integer

值:String

 

HashMap<String,Student>

键:String  学号

值:Student 学生对象

 

HashMap<Student,String>

键:Student

要求:如果两个对象的成员变量值都相同,则为同一个对象。

值:String

 

5.2, LinkedHashMap:

是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。

由哈希表保证键的唯一性

由链表保证键盘的有序(存储和取出的顺序一致)

5.3,TreeMap:是基于红黑树的Map接口的实现。

 

TreeMap <String,String>

键:String

值:String

 

TreeMap<Student,String>

键:Student

值:String

 

举例:

 

 

需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

 

分析:

A:定义一个字符串(可以改进为键盘录入)

B:定义一个TreeMap集合

键:Character

值:Integer

C:把字符串转换为字符数组

D:遍历字符数组,得到每一个字符

E:拿刚才得到的字符作为键到集合中去找值,看返回值

是null:说明该键不存在,就把该字符作为键,1作为值存储

不是null:说明该键存在,就把值加1,然后重写存储该键和值

F:定义字符串缓冲区变量

G:遍历集合,得到键和值,进行按照要求拼接

H:把字符串缓冲区转换为字符串输出

 

 

录入:linqingxia

结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1)

 

publicclass TreeMapDemo {

publicstatic void main(String[] args) {

定义一个字符串(可以改进为键盘录入)

Scanner sc= new Scanner(System.in);

System.out.println("请输入一个字符串:");

Stringline = sc.nextLine();

 

定义一个TreeMap集合

TreeMap<Character,Integer> tm = new TreeMap<Character, Integer>();

 

把字符串转换为字符数组

char[] chs= line.toCharArray();

 

遍历字符数组,得到每一个字符

for(charch : chs){

拿刚才得到的字符作为键到集合中去找值,看返回值

Integer i=  tm.get(ch);

 

是null:说明该键不存在,就把该字符作为键,1作为值存储

if(i ==null){

tm.put(ch,1);

}else {

不是null:说明该键存在,就把值加1,然后重写存储该键和值

i++;

tm.put(ch,i);

}

}

 

定义字符串缓冲区变量

StringBuildersb=  new StringBuilder();

 

遍历集合,得到键和值,进行按照要求拼接

Set<Character>set = tm.keySet();

for(Characterkey : set){

Integervalue = tm.get(key);

sb.append(key).append("(").append(value).append(")");

}

 

把字符串缓冲区转换为字符串输出

Stringresult = sb.toString();

System.out.println("result:"+result);

}

}

 

5.4,Hashtable和HashMap的区别?

Hashtable:线程安全,效率低。不允许null键和null值

HashMap:线程不安全,效率高。允许null键和null值

 

 

5.5, Properties

Properties是Hashtable的子类,是属性集合类。是一个可以和IO流相结合使用的集合类。

可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特殊功能:

publicObject setProperty(String key,String value):添加元素

publicString getProperty(String key):获取元素

publicSet<String> stringPropertyNames():获取所有的键的集合

publicvoid load(Reader reader):把文件中的数据读取到集合中

publicvoid store(Writer writer,String comments):把集合中的数据存储到文件

 

 

二、Collections类

是针对集合进行操作的工具类,都是静态方法。

 

要知道的方法

publicstatic <T> void sort(List<T> list):排序 默认情况下是自然顺序。

publicstatic <T> int binarySearch(List<?> list,T key):二分查找

publicstatic <T> T max(Collection<?> coll):最大值

publicstatic void reverse(List<?> list):反转

publicstatic void shuffle(List<?> list):随机置换

 

Collection和Collections的区别?

Collection:是单列集合的顶层接口,有子接口List和Set。

Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

 

 

案例:

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.HashMap;

importjava.util.TreeSet;

 

模拟斗地主洗牌和发牌

 

分析:

A:创建一个牌盒

B:装牌

C:洗牌

D:发牌

 

思路:

A:创建一个HashMap集合

B:创建一个ArrayList集合

C:创建花色数组和点数数组

D:从0开始往HashMap里面存储编号,并存储对应的牌

同时往ArrayList里面存储编号即可。

E:洗牌(洗的是编号)

F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

 

publicclass PokerDemo {

publicstatic void main(String[] args) {

创建一个HashMap集合

HashMap<Integer,String> hm = new HashMap<Integer, String>();

 

创建一个ArrayList集合

ArrayList<Integer>array = new ArrayList<Integer>();

 

创建花色数组和点数数组

定义一个花色数组

String[]colors = { "♠", "♥", "♣", "♦" };

定义一个点数数组

String[]numbers = { "3", "4", "5", "6","7", "8", "9", "10", "J","Q",

"K","A", "2", };

 

从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。

int index= 0;

 

for(String number : numbers) {

for(String color : colors) {

Stringpoker = color.concat(number);

hm.put(index,poker);

array.add(index);

index++;

}

}

hm.put(index,"小王");

array.add(index);

index++;

hm.put(index,"大王");

array.add(index);

 

洗牌(洗的是编号)

Collections.shuffle(array);

 

发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

TreeSet<Integer>fengQingYang = new TreeSet<Integer>();

TreeSet<Integer>linQingXia = new TreeSet<Integer>();

TreeSet<Integer>liuYi = new TreeSet<Integer>();

TreeSet<Integer>diPai = new TreeSet<Integer>();

 

for (int x= 0; x < array.size(); x++) {

if (x>= array.size() - 3) {

diPai.add(array.get(x));

} else if(x % 3 == 0) {

fengQingYang.add(array.get(x));

} else if(x % 3 == 1) {

linQingXia.add(array.get(x));

} else if(x % 3 == 2) {

liuYi.add(array.get(x));

}

}

 

看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

lookPoker("风清扬", fengQingYang, hm);

lookPoker("林青霞", linQingXia, hm);

lookPoker("刘意", liuYi, hm);

lookPoker("底牌", diPai, hm);

}

 

写看牌的功能

publicstatic void lookPoker(String name, TreeSet<Integer> ts,

HashMap<Integer,String> hm) {

System.out.print(name+ "的牌是:");

for(Integer key : ts) {

Stringvalue = hm.get(key);

System.out.print(value+ " ");

}

System.out.println();

}

}

0 0
原创粉丝点击