文档章节

集合(四)Map

centrald
 centrald
发布于 2016/01/29 22:44
字数 2030
阅读 128
收藏 8
点赞 1
评论 0

 Collection集合和Map集合的区别:

          a: Map集合属于双列集合 , Collection属于单列集合

          b: Map集合键是唯一性的, 而Collection集合中的Set集合可以保证元素的唯一性

          c: Map集合的数据结构只和键有关系 ,和值没有关系 , 而Collection集合的数据结构和元素有关系

  Map集合是一个接口 , 接口不能直接实例化 , 如果我们要对其进行实例化,那么就需要使用子类 , HashMap 和  TreeMap

 Map集合的功能概述:

a: 添加元素

  V put(K key, V value)         添加元素

  b: 删除元素

  void clear() 删除所有的元素

  V remove(Object key) 根据键删除元素

  c: 获取元素

  V get(Object key) 根据键获取值

  Set<K> keySet() 获取所有的键对应的Set集合

  int size() 获取集合的长度

  Collection<V> values() 获取所有的值对应Collection

  d: 判断该功能

  boolean containsKey(Object key) 判断是否包含某一个键

  boolean containsValue(Object value) 判断是否包含某一个值

  boolean isEmpty() 判断集合是否为空

  e: 遍历Map集合

                (1) 键找值

           分析:

       a: 获取所有的键对应的Set集合

       b: 遍历这个Set集合, 获取每一个元素 , 而每一个元素就是键 , 然后根据当前遍历的键获取对应的值

        

                (2)根据键值对象遍历集合

      Set<Map.Entry<K,V>> entrySet(): 获取的是所有的键值对对象对应的set集合

                  分析:

      a: 调用entrySet方法获取所有的键值对对象对应的Set集合

      b: 遍历这个Set集合, 获取每一个元素,而每一个元素应该是键值对对象 , 然后我们调用方法 ,从这个键值对对象中获取对应的键和值

    HashMap的两种遍历方式:

* 请编写程序,存储自定义对象到HashMap集合中,并采用两种方式遍历
 */
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo {
	public static void main(String[] args) {
		Student s1 = new Student("李时珍",50);
		Student s2 = new Student("蒲松龄",39);
		Student s3 = new Student("曹雪芹",41);
		
		//1.创建HashMap对象,键为String类型,值为Student类型
		HashMap<String, Student> hs = new HashMap<String,Student>();
		//将自定义对象加入集合
		hs.put("本草纲目", s1);
		hs.put("聊斋志异", s2);
		hs.put("红楼梦", s3);
		//遍历,根据键获取对象
		Set<String> keySet = hs.keySet();
		for(String k:keySet){
			Student st = hs.get(k);
			System.out.println(k+"---"+st.getName()+"---"+st.getAge());
		}
		
		System.out.println("----------------------------------------");
		//2.创建HashMap对象,key为Student类,value为String类型
		HashMap<Student,String> hs2 = new HashMap<Student,String>();
		
		//将自定义对象加入集合
		hs2.put(s3, "红楼梦");
		hs2.put(s2, "聊斋志异");
		hs2.put(s1, "本草纲目");
		
		//遍历,使用entrySet方法,将所有键值对的对象存入Set集合中,然后根据键值对象获取键与值
		Set<Entry<Student, String>> entrySet = hs2.entrySet();
		for(Entry<Student, String> en : entrySet){
			Student st = en.getKey();
			System.out.println(st.getName()+"---"+st.getAge()+"---"+en.getValue());
		}
	}
}

/*
 * 红楼梦---曹雪芹---41
聊斋志异---蒲松龄---39
本草纲目---李时珍---50
----------------------------------------
李时珍---50---本草纲目
曹雪芹---41---红楼梦
蒲松龄---39---聊斋志异

 */

TreeMap:

TreeMap集合的特点: 底层的数据结构是二叉树, 可以对元素进行排序

  而排序有两种方式

   第一种是自然排序 public TreeMap()

  对元素有要求 , 要求元素必须实现 Comparable 接口

  第二种是比较器排序 public TreeMap(Comparator comparator)

   我们到底使用的是自然排序还是比较器排序主要依赖于构造方法  

                Map集合的数据结构只和键有关系,和值没有关系

TreeMap的两种遍历方式

/*
 * 请编写程序,存储自定义对象到TreeMap集合中,并采用两种方式遍历.
 */

import java.util.Map.Entry;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;


public class TreeMapDemo {
	public static void main(String[] args) {
		//创建自定义对象
		Student s1 = new Student("曹雪芹",41);
		Student s2 = new Student("蒲松龄",39);
		Student s3 = new Student("李时珍",50);
		//使用TreeMap类中的比较器进行排序
		TreeMap<Student, String> tm = new TreeMap<Student,String>(new Comparator<Student>() {
			//重写Comparator的compare方法
			@Override
			public int compare(Student st1, Student st2) {
				// TODO Auto-generated method stub
				//比较年龄
				int num = st1.getAge()-st2.getAge();
				//比较姓名
				int num2 = (num==0)?st1.getName().compareTo(st2.getName()):num;
				return num2;
			}
				
		
		}		
				);
		//将键值对添加入TreeSet集合中
		tm.put(s3, "本草纲目");
		tm.put(s2, "聊斋志异");
		tm.put(s1, "红楼梦");
		//1.使用键值对对象遍历TreeMap集合
		//将TreeSet键值对对象存储到set集合中
		Set<Entry<Student, String>> entrySet = tm.entrySet();
		//用键值对对象获取key,value值
		for(Entry<Student, String> en :entrySet){
			Student key = en.getKey();
			String value = en.getValue();
			System.out.println(key.getName()+"---"+key.getAge()+"----"+value);
		}
		//2.根据获取到的key去获取value
		System.out.println("-----------------------------------------------------------");
		Set<Student> st = tm.keySet();
		//遍历
		for(Student sNum:st){
			System.out.println(sNum.getName()+"---"+sNum.getAge()+"---"+tm.get(sNum));
		}
			
	}
}
/*
 * 结果:
 蒲松龄---39----聊斋志异
曹雪芹---41----红楼梦
李时珍---50----本草纲目
-----------------------------------------------------------
蒲松龄---39---聊斋志异
曹雪芹---41---红楼梦
李时珍---50---本草纲目
 */

最后再举几个使用Map集合的例子

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*
 * 需求:统计字符串中每个字符出现的次数	"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
 * 
 * 要点:1.根据HashMap集合的特点去存储字符的出现次数
 * 2.对于HashMap的遍历方式进行学习与理解
 * 3.选用StringBuffer进行拼接,减少内存资源的消耗
 * 4.更优的方式是使用StringBuilder进行拼接,因为StringBuffer是线程安全的,拼接速度较慢。StringBuilder是线程不安全的,
 * 适用于单线程任务,速度更快
 */

public class HashMapTest {
	public static void main(String[] args) {
		//定义一个字符串
		String st = "aababcabcdabcde";
		//创建一个HashMap集合
		HashMap<Character,Integer> hs = new HashMap<Character,Integer>();
		//遍历字符串,将字符串添加到HashMap集合中去
		for(int i = 0;i<st.length();i++){
			char charAt = st.charAt(i);
			//將要查找的字符作為鍵,去HashMap中去查找
			Integer num = hs.get(charAt);
			//如果不存在,將其值num赋值为1
			if(num==null){
				hs.put(charAt, 1);
			}
			//如果已经存在该键,将该键的值+1,
			else{
				num++;
				hs.put(charAt, num);
			}
		}
		//测试HashMap中的结果
		//System.out.println(hs);
		//创建StringBuffer对象,按照要求进行拼接
		StringBuffer stb = new StringBuffer();
		//遍历HashMap集合,按照指定格式进行输出
		//将HashMap集合对对象存储到Set集合中
		Set<Entry<Character, Integer>> entrySet = hs.entrySet();
		//分别获取Set集合中的键值对对象的key,value值,然后进行拼接
		for( Entry<Character, Integer>  en:entrySet){
			stb.append(en.getKey()).append("(").append(en.getValue()).append(")");
		}
		//输出
		System.out.println(stb.toString());
	}
	
}
/*结果:
 * a(5)b(4)c(3)d(2)e(1)
 */

集合嵌套的使用

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*集合嵌套实例:
 * HashMap的嵌套
 *明:
 *	李时珍 本草纲目   
 *清:
 *	曹雪芹 红楼梦
 *	蒲松龄 聊斋志异
 */
public class HashMapNest {
	public static void main(String[] args) {
		//创建嵌套HashMap集合对象
		HashMap<String,HashMap<String, String>> hm = new HashMap<String,HashMap<String,String>>();
		
		//创建明朝作者,书籍集合对象
		HashMap<String, String> hMing = new HashMap<String,String>();
		
		//添加明朝集合中的key,value值		
		hMing.put("李时珍", "本草纲目");		
		//创建清朝作者,书籍对象
		HashMap<String, String> hQing = new HashMap<String,String>();
		hQing.put("蒲松龄", "聊斋志异");
		hQing.put("曹雪芹", "红楼梦");
		//将小范围集合添加进大范围集合中
		hm.put("明", hMing);
		hm.put("清", hQing);
		//遍历集合
		//获取外集合键值对对象
		Set<Entry<String, HashMap<String, String>>> entrySet = hm.entrySet();
		for(Entry<String, HashMap<String, String>> en:entrySet){
			//获取键值
			String key1 = en.getKey();
			System.out.println(key1+":");
			//获取外集合value值(即内集合)
			HashMap<String,String> hm2 = en.getValue();
			//获取内集合键值对对象
			Set<Entry<String, String>> entrySet2 = hm2.entrySet();
			for(Entry<String, String> en2:entrySet2){
				//获取内集合键值
				String key2 = en2.getKey();
				System.out.println(key2+"---"+en2.getValue());
			}
			
		}
		
	}
}

/*
 清:
蒲松龄---聊斋志异
曹雪芹---红楼梦
明:
李时珍---本草纲目
 */



HashMap和HashSet的区别 

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

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

Collections

                        集合工具类,该类中提供了很多操作集合的方法

public static <T> void sort(List<T> list): 排序,默认按照自然顺序

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

public static <T> T max(Collection<?> coll): 获取最大值

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

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

 


© 著作权归作者所有

共有 人打赏支持
centrald
粉丝 11
博文 68
码字总数 114870
作品 0
杭州
程序员
day18 java 语言中的Map集合

day18 java 语言中的Map集合 一、Map集合的概述: 学完了set集合与list集合以后,我们在学习Map集合,这个集合与前面的两种集合具有一定的区别,在存储值的方式就有区别了,他是以“键--->值...

孤独一夜 ⋅ 2017/10/22 ⋅ 0

写一个去重复的有效算法

有这样一个需求:一个List>的集合,map里存放users和telphones两个字段,内容如下: user1: user="张一,张二,张三,张四" telphone="11111,22222,33333,44444" user2: user="张一,张五...

hero00ok ⋅ 2013/12/18 ⋅ 3

遍历Map集合

普通JAVA类遍历Map集合 Map map=new HashMap(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.keySet();//键集合 map.values();//值集合 map.entrySet();//键值集合 //遍历......

leilovege ⋅ 2014/02/10 ⋅ 0

Android开发_Gson解析

//转换器 GsonBuilder builder = new GsonBuilder(); // 不转换没有 @Expose 注解的字段 builder.excludeFieldsWithoutExposeAnnotation(); Gson gson = builder.create(); //1、对象转strin......

zhangty0223 ⋅ 2013/08/31 ⋅ 0

day16 java语言中的----set集合

day16 java语言中的----Set集合 一、集合【collection】概述: 这里我们就开始学习一下set集合,我们就说三个集合,分别是set/list/map三种,他们都是接口,list和set集合都是collection主接...

孤独一夜 ⋅ 2017/10/19 ⋅ 0

更好的使用Java集合(四)

集合(List)可以快速地查找现有的元素。但是,要查看一个元素,需要有要查找元素的精确副本。这不是一种非常通用的查询方式。通常,如果知道某些键的信息,并想要查找与之对应的元素,则可以使...

杰克鹏仔 ⋅ 2016/03/17 ⋅ 0

Groovy(四)-布尔值,Lists,Arrays,Maps

译文:Groovy Language Documentation 布尔值 布尔值是一种用来表示真值:true和false的特殊数据类型。用这种数据类型可以设置简单的标志位来跟踪true/false情况。 布尔类型可以保存在变量中...

ZJ_Rocky ⋅ 2017/12/06 ⋅ 0

七、JAVA基础--集合

一、集合框架 将集合的接口与实现分离,用接口类型存放集合引用。 集合有两个基本接口:Collection(不允许重复对象)和Map;Collection又主要是List(有序)和Set(无序)组成。 迭代器:在JavaSE8...

cnslp ⋅ 2017/04/25 ⋅ 0

Map-HashMap-LinkedHashMap-Map.Entry-Collections-可变参数

一.Map 接口(java.util) 定义:public interface Map 介绍: (1)Map是一个接口,含有两个泛型,创建子类对象的时候,需要传递两个泛型的值; (2)将键映射到值的对象。一个映射不能包含重复的键;每...

老胡2015 ⋅ 2017/06/18 ⋅ 0

海量数据的二度人脉挖掘算法(Hadoop 实现)

原创博客,转载请注明:http://my.oschina.net/BreathL/blog/75112 最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐;简单描述:即你...

Breath_L ⋅ 2012/08/28 ⋅ 37

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 14分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 15分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 16分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 30分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 35分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 37分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 37分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 38分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 38分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 39分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部