Java基础学习之Map集合

一 map集合的特点

---以键值对形式来保存数据   key   ---value  只能保存对象

 键(key)值(value)来保存数据,其中值(value)可以重复,但键(key)必须是唯一,相同就覆盖.

 也可以为空,但最多只能有一个key为空,

 它的主要实现类有HashMap(去重)、LinkedHashMap、TreeMap(排序)。 指的都是对key 的操作.

 HashSet 去重 和 HashMap 的关系

 HashSet依赖Map 存储数据,set在保存数据时,实际上是在向Map中key 这一列中存数据


一 首先创建一个HashMap 看一下它的用法

public static void fun1() {
		//创建一个HashMap
       HashMap<String, Integer> map = new HashMap<>();
    Integer k = map.put("前海", 62);// k 表示被覆盖的 value值(null)
    Integer k1 = map.put("后海", 61);
    Integer k2 = map.put("左海", 65);
    Integer k3 = map.put("右海", 60);
    Integer k4 = map.put("右海", 70);
       System.out.println(k);
       System.out.println(k1);
       System.out.println(k2);
       System.out.println(k3);
       System.out.println(k4);
       System.out.println(map);
	}
打印结果:

null
null
null
null
60
{前海=62, 后海=61, 左海=65, 右海=70}

map添加方法返回的是前一个value值  k k1 k2 k3 未创建之前 value值都为null.

以下是map的一些操作方法

public static void fun2() {
		HashMap<String, Integer> map = new HashMap<>();
		//判断包含 
		map.put("前海", 62);
	    map.put("后海", 61);
	    map.put("左海", 65);
	    map.put("右海", 60);
	     boolean b1 = map.containsKey("大海");
	     boolean b2 = map.containsValue(70);
	     System.out.println(b1);
	     System.out.println(b2);
		//获取Map中所有key的Set集合
	    Set<String> set = map.keySet();
	    System.out.println(set);
	    //获取Map中所有value的Collection集合
	   Collection<Integer> vCollection = map.values();
	   System.out.println(vCollection);
	   
	   //删除,根据key 删除整个键值对
	 Integer v =  map.remove("后海");
	   System.out.println(v);
	   System.out.println(map.toString());
	   
	   //清空 Map
	   map.clear();
	   System.out.println(map);
	}

创建一个map key保存学生 value保存 户籍 去重

跟Set 集合一样重写HashCode 和 equals 方法

public static void fun3() {
		//创建一个map key保存学生 value保存 户籍 去重
		//跟Set 集合一样重写HashCode 和 equals 方法
		HashMap<Student, String> map = new HashMap<>();
		map.put(new Student("大海", 11), "北京");
		map.put(new Student("天瑞", 11), "上海");
		map.put(new Student("董小姐", 11), "北海道");
		map.put(new Student("大海", 11), "天津");
	    System.out.println(map);
	}
Student 类中重写
{[天瑞, 11]=上海, [董小姐, 11]=北海道, [大海, 11]=天津}

遍历map的两种方法

public static void fun4() {
		//遍历Map
		HashMap<String, Integer> map = new HashMap<>();
		//判断包含 
		map.put("前海", 62);
	    map.put("后海", 61);
	    map.put("左海", 65);
	    map.put("右海", 60);
	   //通过迭代器
	  Set<String> s1=  map.keySet();
	  Collection<Integer>c1 = map.values();
	  Iterator<String> iterator =s1.iterator();
	  Iterator<Integer> iterator2 = c1.iterator();
	  while (iterator.hasNext()) {
		String string = iterator.next();
		Integer integer = iterator2.next();
		
		System.out.println(string+"="+integer);
	}
	  System.out.println("*******************");
//通过增强for循环
	 for (String key : map.keySet()) {
		Integer value = map.get(key);
		System.out.println(key+"="+value);
		System.out.println("-------------------");
	    }
	}
//另外使用Entry也可以遍历map 
public static void fun5() {
		HashMap<String, Integer> map = new HashMap<>();
		//Entry接口
		//Entry 中保存的是 键值对对象
		// 相当于把Map 中的key 和 value 封装成了一个对象
		map.put("前海", 62);
	        map.put("后海", 61);
	        map.put("左海", 65);
	        map.put("右海", 60);
	 //利用entrySet 遍历集合(迭代器)
	    //增强for循环
	    Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
	     Iterator<Map.Entry<String, Integer>>  iterator = entrySet.iterator();
	      while (iterator.hasNext()) {
		Entry<String , Integer> entry = iterator
				.next();
		 //从对象中获取 key 和 value
//		String key = entry.getKey();
//		Integer value = entry.getValue();
//		System.out.println(key+"="+value);
		System.out.println(entry);
	}
	}
//父类是HashMap(同HashSet)
		//特点:有序的(怎么存的,怎么按顺序打印出来)
		LinkedHashMap<String, Integer> lMap = new LinkedHashMap<>();
		lMap.put("前海", 62);
	    lMap.put("后海", 61);
	    lMap.put("左海", 65);
	    lMap.put("右海", 60);
		System.out.println(lMap);

TreeMap

使用TreeMap排序
public static void fun1() {
		//使用TreeMap 进行排序
		//跟TreeSet相同
		TreeMap<Student, String> treeMap = new TreeMap<>();
		treeMap.put(new Student("大海", 5), "马栏山");
		treeMap.put(new Student("中海", 15), "牛栏山");
		treeMap.put(new Student("小海", 20), "羊栏山");
		System.out.println(treeMap);
	}
package com.lanou3g;

public class Student implements Comparable<Student>{
	private String name;
	private int  age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "[" + name + ", " + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public int compareTo(Student o) {
		int n = this.age-o.getAge();
		return n==0?-1:n;
	}
	

}
Student 类实现了comparable接口,重写了compareTo方法.或者向下面一样创建个比较器类 要TreepMap 实现kjf类
class kjf implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		int n = o1.getAge()-o2.getAge();
		return n==0?-1:n;
	}

工具类collections 的3中常用方法

public static void fun2() {
		//  洗牌方法 .随机打乱集合的顺序
		ArrayList<Integer> list  = new ArrayList<>();
		list.add(1);
		list.add(3);
		list.add(4);
		list.add(2);
		list.add(5);
		list.add(8);
		list.add(9);
		list.add(7);
		list.add(6);
		System.out.println(list);
//		Collections.shuffle(list);
		System.out.println("-----------------");
		System.out.println(list);
		//反转
		Collections.reverse(list);
		System.out.println(list);
		//排序
		Collections.sort(list);
		//二分查找
		int index=Collections.binarySearch(list, 15);
		System.out.println(list);
		System.out.println(index);
	}

利用collections 中的排序方法 排序对象

使用该方法时,也需要实现Comparable 接口  写排序规则.


ArrayList<Student> list  = new ArrayList<>();
		list.add(new Student("大海", 18));
		list.add(new Student("中海", 15));
		list.add(new Student("小海", 60));
		Collections.sort(list);
		System.out.println(list);
	}

下面看一个Map应用的小例子:


 1.创建一副牌1-k 大王 小王   (使用Map集合)

 2.洗牌

 3.发牌 三个人 和底牌

 4.看牌 需要排序


 *思路:

 1.创建一个Map 

 2.拼接牌的字符串

 3.放到集合中 集合中的key 为0-53

 4.创建list 洗牌

 5.发索引

 6.将索引保存到 能排序的treeset

 7.通过索引找到对应的牌



package com.lanou3g;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class Demo04 {
	public static void main(String[] args) {
		//创建一个Map
		HashMap<Integer, String> card = new HashMap<>();
		//创建一个list保存索引
		ArrayList<Integer> list = new ArrayList<>();
		int index =0;
		// 拼接牌的字符串
		// 字符串1保存 牌数
		String [] arr1 = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
		String [] arr2 = {"♠️","♥️","♣️","♦️"};
		for (int i = 0; i < arr2.length; i++) {
			for (int j = 0; j < arr1.length; j++) {
				String str = arr2[i]+arr1[j];
				//放入map中
				card.put(index, str);
				list.add(index);
				index++;
			}
		}
		System.out.println(card);
		
		 //大王 小王放入map
	 	  card.put(index, "小王");
	 	  list.add(index);
		  card.put(++index, "大王");
		  System.out.println(card);
		  list.add(index);
		  System.out.println(list);
		//洗牌 
		  Collections.shuffle(list);
		  System.out.println(list);
		//发牌
		  TreeSet<Integer> set1 = new TreeSet<>();
		  TreeSet<Integer> set2 = new TreeSet<>();
		  TreeSet<Integer> set3 = new TreeSet<>();
		  TreeSet<Integer> set4 = new TreeSet<>();
		//发list 索引
		  for (int i = 0; i < list.size(); i++) {
			//取出每一个索引
			  Integer n =list.get(i);
			  if (i>list.size()-3) {
				set4.add(n);
			}else {
				if (i%3 == 0) {
					set1.add(n);
				}else {
					if (i%3==1) {
						set2.add(n);
					}else {
						set3.add(n);
					}
				}
			}
		}
		  //看牌 调用看牌的方法
		  kanPai(card, set1, "大海");
		  kanPai(card, set2, "阿凡达");
		  kanPai(card, set3, "瑞");
		  kanPai(card, set4, "底牌");  
	}
	// 看牌 通过索引找到对应的牌
	  
			 public static void kanPai(HashMap<Integer, String> card,
					 TreeSet<Integer> set,
					 String name) {
				 System.out.println(name+"的牌:" );
				//遍历set
				 for (Integer key : set) {
					//从Map通过索引 中取出牌
					 String value = card.get(key);
					 System.out.print(value+" ");
				}
				 System.out.println();
			 }

}

map嵌套


/*
	 * Map嵌套
	 * Java学科
	 * java 1班  -- 保存是学生 和 户籍
	 * key shi 学生  value 是字符串
	 * java 2班  -- 保存是学生 和 户籍
	 * 
	 * Java学科 是一个map
	 * key 是班级的 小map
	 * 保存了两个键值对 ----  1班 和 2班 value 是字符串 1班或2班
	 * 遍历一下
 */

import java.util.HashMap;

public class Demo05 {
     public static void main(String[] args) {
		//Java 一班
    	 HashMap<Student, String> map1 = new HashMap<>();
    	 map1.put(new Student("前海", 11),"牛蓝山");
    	 map1.put(new Student("后海", 15),"祖兰山");
    	 // Java 二班
    	 HashMap<Student, String> map2 = new HashMap<>();
    	 map2.put(new Student("左瑞", 10),"黑栏山");
    	 map2.put(new Student("右瑞", 19),"白栏山");
    	 
    	 //创建 Java学科
    	 HashMap<HashMap<Student, String>, String> javamap = new HashMap<>();
    	 javamap.put(map1, "Java一班");
    	 javamap.put(map2, "Java二班");
    	 System.out.println(javamap);
    	 //遍历
    	 for (HashMap<Student, String> ban : javamap.keySet()) {
    		 //打印班
    		 System.out.println(javamap.get(ban));
    		 //遍历班
			for (Student stu : ban.keySet()) {
				//打印学生和户籍
				System.out.print("户籍:"+ban.get(stu)+"  ");
				System.out.print("学生:"+stu+"  ");
			}
			System.out.println();
		}
	}
}














猜你喜欢

转载自blog.csdn.net/vlin_fan/article/details/80444338
今日推荐