Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
Map集合的特点
1、Map集合中保存的都是键值对,键和值是一一对应的
2、一个映射不能包含重复的值
3、每个键最多只能映射到一个值上
Map接口和Collection接口的不同
Map是双列集合的根接口,Collection是单列集合的根接口
1、Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口)
2、Map的键是唯一的,Collection的子接口Set是唯一的
3、Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效
Map集合的遍历方式
package com.jd.text; import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class Demo06 { public static void main(String[] args) {
// 创建map集合
Map map = new HashMap<>();
// 添加 将指定的值与此映射中的指定键关联
map.put("张三", 12);
map.put("李四", 13);
map.put("蔡文姬", 14);
map.put("王五", 15);
// 删除 如果存在一个键的映射关系,则将其从此映射中移除
map.remove("王五");
// map.clear();//删除全部 从此映射中移除所有映射关系
// 根据指定的key获取对应的value
Object obj1 = map.get("张三");
System.out.println(obj1);
// 是否包含指定的key,包含返回true,不包含返回false。
boolean b = map.containsKey("张三");
System.out.println(b);
// 是否包含指定的value,包含返回true,不包含返回false。
boolean c = map.containsValue(13);
System.out.println(c); System.out.println("******************************"); // map集合的遍历,通过keyset()方法(迭代器)
Set keySet = map.keySet();
Iterator iter = keySet.iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的遍历,通过keyset()方法(foreach)
Set keySet2 = map.keySet();
for (Object key : keySet2) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的遍历,通过entrySet()方法(foreach)
Set entrySet = map.entrySet();
for (Object obj3 : entrySet) {
Entry e = (Entry) obj3;
Object key = e.getKey();
Object value = e.getValue();
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的values方法,获取到的map集合的value的值组成的collection集合
Collection coll = map.values();
for (Object obj : coll) {
System.out.println(obj);
}
}
}
运行结果:
12
true
true
******************************
李四:13
张三:12
蔡文姬:14
******************************
李四:13
张三:12
蔡文姬:14
******************************
李四:13
张三:12
蔡文姬:14
******************************
13
12
14
TreeMap集合保存自定义对象
package com.jd.text;
import java.util.Set;
import java.util.TreeMap;
/*
* TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
* 1.通过实现Comparable接口,重写compareTo()方法。
*/
public class Demo07 {
public static void main(String[] args) {
TreeMap map=new TreeMap<>();
map.put(new User("张三01", 12),11);
map.put(new User("张三01", 10),11);
map.put(new User("张三02", 13),11);
map.put(new User("张三01", 12),11);
//通过重写hashCode()和equals(Object obj)方法防止重复的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
}
package com.jd.text;
/*
* 通过实现Comparable接口,重写compareTo()方法。
*/
public class User implements Comparable{ private String name;
private int 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 "User [name=" + name + ", age=" + age + "]";
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public User() {
super();
} @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;
User user=(User) obj;
if(age!=user.age)
return false;
if(name==null){
if(user.name!=null)
return false;
}else if(!name.equals(user.name))
return false;
return true;
}
@Override
public int compareTo(Object o) {
if(o instanceof User){
User user=(User) o;
int sum=name.compareTo(user.name);
if(sum==0)
return age-user.age;
return sum;
}
throw new ClassCastException("不是User类型");
} }
运行结果:
User [name=张三01, age=10]:11
User [name=张三01, age=12]:11
User [name=张三02, age=13]:11
package com.jd.text;
/*
* TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
* 2.自己构造比较器实现Comparator接口,重写compare(Object o1, Object o2)方法
*/ import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap; public class Demo08 { public static void main(String[] args) {
TreeMap map=new TreeMap(new MyCompare());
map.put(new User2("张三01", 12),11);
map.put(new User2("张三01", 10),11);
map.put(new User2("张三02", 13),11);
map.put(new User2("张三01", 12),11);
//通过重写hashCode()和equals(Object obj)方法防止重复的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
} class User2{
String name;
int age; public User2(String name,int age){
this.name=name;
this.age=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;
User2 u=(User2) obj;
if(age!=u.age)
return false;
if(name==null){
if(u.name!=null)
return false;
}else if(!name.equals(u.name))
return false;
return true;
}
@Override
public String toString() {
return "User2 [name=" + name + ", age=" + age + "]";
}
}
//比较器
class MyCompare implements Comparator{ @Override
public int compare(Object o1, Object o2) {
if(o1 instanceof User2 && o2 instanceof User2){
User2 u1=(User2) o1;
User2 u2=(User2) o2;
int sum=u1.age-u2.age;
if(sum==0){
return u1.name.compareTo(u2.name);
}
return sum;
}
throw new ClassCastException("不是User2 类型");
} }
运行结果:
User2 [name=张三01, age=10]:11
User2 [name=张三01, age=12]:11
User2 [name=张三02, age=13]:11
Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式的更多相关文章
- 8.13.2 TreeSet实现Comparable接口的两种方式
推荐使用第二种方式,编写比较器可以使数据类的程序耦合度降低,同时比较器也可以重复利用! 第一种方式:数据类实现Comparable接口,实现其中的compareTo方法 创建对象时,使用TreeSet ...
- TreeMap集合根据指定元素,进行删除和修改的两种方式实现及bug梳理
TreeMap根据key中的指定元素进行删除修改的两种方式实现及注意事项: 方式一:利用增强for进行删除和修改 总结:逻辑简单,但是局限性太强,如果排序规则是从小到大进行排序的,则该方法不能进行删除 ...
- Spring IOC 依赖注入的两种方式XML和注解
依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...
- JQuery中阻止事件冒泡的两种方式及其区别
JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...
- JQuery 提供了两种方式来阻止事件冒泡。
JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...
- 遍历Map集合:java.util.Map.Entry、KeySet两种方式
遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...
- java的取出map里所有元素的两种方式
/* * 取出map元素的两种方式 */package com.map.test; import java.util.HashMap;import java.util.Iterator;import ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- [Java] HashMap遍历的两种方式
Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...
随机推荐
- 122_Power Pivot&Power BI不连续日期的日环比
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 这两天有朋友在交流,dax中使用时间智能函数写日环比,一个 dateadd 就可以了.但是有些业务不是每天都连续 ...
- MongoDB启动报错:Unrecognized option: storage try 'mongod --help' for more information(已解决)
问题说明: 今天在使用配置文件方式启动MongoDB时,一直启动失败,报错显示:Unrecognized option: storage try 'mongod --help' for more in ...
- Java测试报告
测试题目:ATM机 程序说明:本程序中共包含了两个类,分别为Account类和AccountManager类 Account类代码: public class Account { private St ...
- 判断数据类型(typeof&instanceof&toString)
一.数据类型 ES6规范中有7种数据类型,分别是基本类型和引用类型两大类 基本类型(简单类型.原始类型):String.Number.Boolean.Null.Undefined.Symbol 引用类 ...
- Html name与id属性的区别
id----id属性规定为 HTML 元素的唯一的标识.当使用html,CSS时,id属性可用作链接锚(link anchor),通过 JavaScript(HTML DOM)getElementBy ...
- Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)
1 导引 我们在博客<Hadoop: 单词计数(Word Count)的MapReduce实现 >中学习了如何用Hadoop-MapReduce实现单词计数,现在我们来看如何用Spark来 ...
- 第06组 Beta冲刺 (1/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.黄少丹 5. 董翔云 6.杜筱 7.鲍凌函 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- 功耗优化之Sensor功耗分析
功耗优化之Sensor功耗分析 一.Sensor功耗问题分类 二.Sensor功耗问题分析方法 SSC子系统引起系统无法进入AOSD问题分析: SSC子系统频繁唤醒AP问题分析方法 SSC子系统的GP ...
- .NET中获取Windows的常见路径
更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月30日. 一.说明 每种平台都其预定义的规则,比如Windows平台有自己的规定.公司也有预定义的规章制度.那么在平台上开发和干活 ...
- BUUCTF-九连环
九连环 这题还是稍微有点难度的 使用16进制打开发现压缩包,用binwalk分离看看 分离得到的压缩包同样16进制看看 可以发现多个压缩包,这种情况应该是伪加密的方式,但是直接使用修复压缩包的方式没法 ...