TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
时间:2018-11-13
本文章向大家介绍TreeMap保存自定义对象,比较的Comparable和Comparator两种方式,需要的朋友可以参考一下
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
- go 语言的库文件放在哪里?如何通过nginx代理后还能正确获取远程地址
- 离线Tarjan算法-最近公共祖先问题
- Java文件上传下载实训
- 【网络编程系列】二:socket通信原理及实践
- textrank算法原理与提取关键词、自动提取摘要PYTHON
- 【网络编程系列】一:字节顺序的大端与小端表示法
- Linux下的make命令用法
- 增量数据丢失的原因分析(三)(r8笔记第91天)
- JS之浏览器对象BOM
- 超清晰的makefile解释、编写与示例
- 一个简单的sql审核案例 (r8笔记第90天)
- Linux wait() 和 waitpid()函数介绍
- #if和#ifdef的区别
- 一个MySQL优化案例的初步思路(r8笔记第87天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- R语言风险价值VaR(Value at Risk)和损失期望值ES(Expected shortfall)的估计
- R语言机器学习实战之多项式回归
- 5000字!带你零距离接触websocket!
- 使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
- 玩转StyleGAN2模型:教你生成动漫人物
- R语言时间序列数据指数平滑法分析交互式动态可视化
- 再见Excel!最强国产开源在线表格Luckysheet走红GitHub
- R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- 手写dubbo框架9-SPI实现
- R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- VsCode插件之Live Serve探秘.(上)
- R语言小数定律的保险业应用:泊松分布模拟索赔次数