Map集合概述特点、基本功能、获取方法、遍历方法(三种)、ArrayList集合嵌套HashMap集合实例、Collections常用方法(附两个斗地主实现案例)

Interface Map< K,V >

所在包:java.util
	K-由此地图维护的键的类型
	V-映射值的类型
public interface Map<K,V>

特点:

  • 将键映射到值的对象。地图不能包含重复的键
  • 每个键可以映射到最多一个值

创建对象格式:

  • 多态创建Map集合对象
  • 实现类使用HashMap

Map集合的常用方法:

方法名 作用
V put(K key,V value) 添加元素
V remove(K key,V value) 根据键值删除对应的值
void clear() 清除所有键值元素
boolean containsKey(Object key) 判断集合中是否包含指定的键
boolean containsValue(Object value) 判断集合中是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 返回集合长度,集合中的键值对的个数(键值有几个则返回几个)

代码示例:

Map<String,String> map = new HashMap<String,String>();
map.put("001","张三");
map.put("002","李四");
map.put("003","王五")System.out.print(map);
输出结果:
	{
   001=张三 , 002=李四 , 003=王五}

Map集合的获取方法

方法名 作用
V get(Object key) 根据键获取值
Set< K > keySet() 获取所有键的集合(返回Set集合)
Collection< V > values() 获取所有值的集合(返回Collection集合)
Set<Map.Entry<K,V>> entrySet() 获取所有键值对象的集合
default V getOrDefault(Object key,V defaultValue) 如果存在相应的key则返回其对应的value,否则返回给定的默认值defaultValue。

代码示例:

public static void main(String[] args){
   
	Map<Integer,String> map = new HashMap<Integer,String>();
	map.put(100,"hello");             
//注意:Map.put(K,V);在存入数据时K一样而V不同时,后面存入的V会将前面已经存入的V给覆盖掉(键相同值覆盖)
	map.put(20,"world");                         
//一般键相同但没有出现值覆盖的原因一般是 对象类作为Key中没有重写equals()和hashCode()方法,
//在类中利用Alt+Insert自动重写即可
	map.put(30,"java");
	Set<Integer>s=map.keySet();                     
//调用keySet()方法 返回值为Set<K>
	System.out.println(map.get(100));      
//调用get()方法 返回值为V
	for(Integer i:s){
   
		System.out.println(i);
	}
	Collection<String> s1 = map.values();    
//调用values()方法 返回值为Collection<V>
	for(String s0:s1){
   
		System.out.println(s0);
	}
}
输出结果:
hello
100
20
30
hello
world
java

Map集合的遍历(三种方法)

方法一:

普遍使用,二次取值操作
	Map<Integer,String> map=new HashMap<Integer,String>();
	map.put(1,"hello");
	map.put(2,"world");
	map.put(3,"java");
	for(Integer i:map.keySet()){
            //利用keySet()和增强for遍历key和value
		System.out.print(i+","+map.get(i));
	}

方法二:

通过Map.entrySet使用iterator遍历key和value
	…(省略初始化赋值操作)
	Set<Map.Entry<Integer,String>> entry=map.entrySet();
	Interator<Map.Entry<Integer,String>> it = entry.iterator();     
	//entrySet()的返回值是Set<Map.Entry<K,V>>,该值带有iterator()迭代器方法
	While(it.hasNext()){
   
		Map.Entry<Integer,String> next=it.next();      
		//Map.Entry<K,V>是单独的一种引用数据类型
		Integer key=next.getKey();
		String value=next.getValue();
		System.out.print(key + " , " + value);
	}

方法三:

通过Map.entrySet遍历key和value,(大容量时推荐)
	…(省略初始化赋值操作)
	for(Map.Entry<Integer,String> me : map.entrySet()){
             
	//直接利用增强for遍历获取的map.entrySet()键值对象集合
		Integer key=me.getKey();                         
	//再利用Map.Entry<K,V>自带的getKey()和getValue()方法获取键、值。
		String value=me.getValue();
		System.out.print(key+","+value);
	}

ArrayList集合嵌套HashMap集合实例(三个小题目)

题目一:
创建一个ArrayList集合,存储三个元素,每个元素都是HashMap,每个HashMap的键和值都是String,并遍历。
代码示例:

public static void main(String[] args){
   
	ArrayList<HashMap<String,String>>d=newArrayList<HashMap<String,String>>();     
	//创建ArrayList集合
	HashMap<String,String> t1 = new HashMap<String,String>();                              
	//创建HashMap集合
	HashMap<String,String> t2 = new HashMap<String,String>();
	HashMap<String,String> t3 = new HashMap<String,String>();
	t1.put("01","hello");
	t1.put("02","world");
	t2.put("03","hello");
	t2.put("04","world");
	t3.put("05","hello");
	t3.put("06","world");
	d.add(t1);         //把HashMap集合作为元素添加到ArrayList集合中
	d.add(t2);
	d.add(t3);
	for(HashMap<String,String>s:d){
               //遍历ArrayList集合
		for(String me : s.keySet()){
               
	//用s.entrySet()方法或者s.keySet()方法都可,数据量比较小时建议使用keySet()
			String value = s.get(me);
			System.out.print(me+","+value+"");
		}
		System.out.println();
	}
}

题目2:
创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键是String,值是ArrayList,每一个ArrayList的元素的String,并遍历。
代码示例:

public static void main(String[] args){
   
	HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();   
	//创建HashMap集合
	ArrayList<String> s1 = new ArrayList<String>();                               
	//创建ArrayList集合,并添加元素
	ArrayList<String> s2 = new ArrayList<String>();
	ArrayList<String> s3 = new ArrayList<String>();
	s1.add("hello");
	s1.add("001");
	s2.add("wordl");
	s2.add("002");
	s3.add("java");
	s3.add("003");
	map.put("01",s1);                                       
	//把ArrayList作为元素添加到HashMap集合
	map.put("02",s2);
	map.put("03",s3);
	for(Map.Entry<String,ArrayList<String>>me:map.entrySet()){
              
	//遍历HashMap集合
		String key=me.getKey();
		ArrayList<String> value = me.getValue();
		System.out.print(key+",");
		for(Strings:value){
   
			System.out.print(s+"");
		}
		System.out.println();
	}
}

题目3:键盘录入一个字符串,要求统计字符串中每个字符出现的次数
举例:键盘录入“aababcabcdabcde” 输出:“a5 b4 c3 d2 e1”
代码示例:

public static void main(String[] args){
   
	Scanner sc = new Scanner(System.in);          //创建输入流
	Map<Character,Integer> map = new HashMap<Character,Integer>();    
	//创键HashMap集合,键是Character,值是Integer
	String s = sc.nextLine();
	for(inti=0;i<s.length();i++){
                 //遍历每个字符
		char c = s.charAt(i);          
		Integer value = map.get(c);       
		//get得到value的值,在Map集合中get没有得到值则返回null
		if( value == null ){
                  
		//返回null说明Map集合中还没有存储该字符串
			map.put(c,1);            
		//将该字符串put进Map中并将value赋上初值1 表示该字符出现了一次
		}else{
   
			value++;                   
//value不是null则表明该字符在Map中出现过了,再出现则令value++,并将新的value值put进Map集合中
			map.put(c,value);
		}
	}
	StringBuilder sb = new StringBuilder();     
	//初始化StringBuilder类型用于字符串拼接
	for(Map.Entry<Character,Integer> me : map.entrySet()){
            //遍历Map集合
		Character key = me.getKey();
		Integer value = me.getValue();
		sb.append(key).append(value).append("");                
		//利用StringBuilder集合中append方法实现字符串拼接
	}
	String result = sb.toString();                 
	//用toString方法将StringBuilder转换为String类型
	System.out.println(result);                 
}

Collection常用方法:针对集合操作的工具类

所在包:java.util 
public class Collections 
	 extends Object

常用方法:

方法名 作用
public static < T extends Comparable< ? Super T>> void sort(List< T > list) 将指定的列表按升序排列
public static void reverse(List<?> list) 反转指定列表中元素的顺序
public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表

关于集合升序的方法:
代码示例:

升序:
List<Integer> list = Arrays.asList(2,5,3,6,0,1,4);
	Collections.sort(list);
	System.out.print(list);
输出结果:
	[0,1,2,3,4,5,6]
-------------------------------------------------------------------------------------------------
降序:
List<Integer> list = Arrays.asList(2,5,3,6,0,1,4);
	Collections.sort( list , new Comparator<Integer>(){
   
		@Override
		public int compare(Integer o1,Integer o2){
   
			return o2-o1;        
		//o2-o1时逆序存入、o1-o2时升序存入、return 1时按存入顺序输出、return -1时按存入顺序逆输出
		}
	})
	System.out.print(list);
输出结果:
	[6,5,4,3,2,1,0]

模拟斗地主案例1(普通)

要求:通过程序实现斗地主过程中的洗牌,发牌和看牌
思路:
1.创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现
2.往牌盒里装牌
3.洗牌,也就是把牌打散,利用Collection中的shuffle()方法实现
4.发牌,也就是遍历集合,给三个玩家发牌
5.看牌,也就是三个玩家分别遍历自己的牌
代码示例:

public static void main(String[] args){
   
	ArrayList<String> t = new ArrayList<String>();               
	//创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现
	String[] h = {
   "♣","♥","♠","♦"};
	String[] p = {
   "2","3","4","5","6","7","8","9","10","J","Q","K","A"};
	for(Stringi:h){
   
		for(Stringj:p){
   
			t.add(i+j);            //往牌盒里装牌
		}
	}
	t.add("大王");
	t.add("小王");
	Collections.shuffle(t);                          
	//洗牌,也就是把牌打散,利用Collection中的shuffle()方法实现
	ArrayList<String> t1 = new ArrayList<String>();
	ArrayList<String> t2 = new ArrayList<String>();
	ArrayList<String> t3 = new ArrayList<String>();
	ArrayList<String> dp = new ArrayList<String>();
	for(int i=0;i<t.size();i++){
                     //发牌,也就是遍历集合,给三个玩家发牌
		String s=t.get(i);
		if(i>=t.size()-3){
   
			dp.add(s);
		}else if(i%3==0){
   
			t1.add(s);
		}else if(i%3==1){
   
			t2.add(s);
		}else{
   
		t3.add(s);
		}
	}
	poker("t1",t1);                   //调用看牌方法
	poker("t2",t2);
	poker("t3",t3);
	poker("dp",dp);
	}
public static void poker(String name,ArrayList<String> list){
                  
//看牌,也就是三个玩家分别遍历自己的牌
	System.out.print(name+":");
	for(String i:list){
   
		System.out.print(i+" ");
	}
	System.out.println();
}

模拟斗地主案例2(优化)

需求:通过程序实现斗地主过程中的洗牌,发牌和看牌。要求:对牌进行排序
思路:
1.创建HashMap,键是编号,值是牌
2.创建ArrayList,存入编号
3.创建花色数组和点数数组
4.从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号
5.洗牌(洗的是编号),用Collection.shuffle()方法进行随机排序
6.发牌(发的是编号,为了保证编号是排序的,创建TreeSet集合接收)
7.定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合中找对应的牌)
8.调用查看方法
代码示例:

public static void main(String[] args){
   
	String[] h = {
   "♣","♥","♠","♦"};             
	//创建花色数组和点数数组
	String[] p = {
   "3","4","5","6","7","8","9","10","J","Q","K","A","2"};
	HashMap<Integer,String> map = new HashMap<Integer,String>();    
	//创建HashMap,键是编号,值是牌
	ArrayList<Integer> temp = new ArrayList<Integer>();         
	//创建ArrayList,存入编号
	
	int ans = 0;
	for(String i:p){
   
		for(String j:h){
   
			map.put(ans,i+j);                 
			//从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号
			temp.add(ans);        
			ans++;
		}
	}
	map.put(ans,"大王");
	temp.add(ans++);
	map.put(ans,"小王");
	temp.add(ans);
	Collections.shuffle(temp);          
	//**洗牌(洗的是编号),用Collection.shuffle()方法进行随机排序**
	
	TreeSet<Integer> p1 = new TreeSet<Integer>();       
	TreeSet<Integer> p2 = new TreeSet<Integer>();
	TreeSet<Integer> p3 = new TreeSet<Integer>();
	TreeSet<Integer> dp = new TreeSet<Integer>();
	for(int i = 0;i<temp.size();i++){
                  
	//发牌(发的是编号,为了保证编号是排序的,创建TreeSet集合接收)
		if(i>=temp.size()-3){
   
			dp.add(temp.get(i));
		}else if(i%3==0){
   
			p1.add(temp.get(i));
		}else if(i%2==0){
   
			p2.add(temp.get(i));
		}else{
   
			p3.add(temp.get(i));
		}
	}
	show("张三",p1,map);            //调用查看方法
	show("李四",p2,map);
	show("王五",p3,map);
	show("底牌",dp,map);
}
		
Public static void show(String name,TreeSet<Integer> tree,HashMap<Integer,String> map){
             
//定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合中找对应的牌)
	System.out.print(name+":");
	for(Integer i:tree){
   
		System.out.print(map.get(i)+" ");
	}
	System.out.println();
}
全部评论

相关推荐

01-02 00:50
三峡大学 Java
程序员牛肉:这简历一出手就离失业不远了。 作为一家公司来讲,我如果要招日常实习生,那我对实习生最基本的要求就是要能干活,毕竟你就待三四个月,谁会留心培养你? 那么除了院校之外,最重要的就是项目和实习了。没有实习的话项目就好好搞。 但是你说你这个项目吧:课程作业管理系统和TMS运输管理系统。这两个基本就和闹着玩差不多。 你作为一个想要应聘Java开发实习生的人,对后端的理解还仅仅停留在:“使用mapper和sql映射”,“使用SQL进行多表调用”,“基于MySQL简历表结构”,“基于Spring boot完成CURD操作”这种玩具上......... 找不到后端实习的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务