java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)
import java.util.*;
public class Person implements Comparable<Person>//使Person的属性具有比较性
{
private String name;
private int age;
public Person(String name,int age)//初始化构造函数
{
this.name = name;
this.age = age;
}
public void set(String name,int age)//重新设置姓名和年龄
{
this.name = name;
this.age = age;
}
public String getName()//获取姓名
{
return name;
}
public int getAge()//获取年龄
{
return age;
}
public String toString()//将姓名和年龄以字符串的形式返回
{
return name+","+age;
}
//出现重名时,再找到另一个hash地址用来存储数据(底层自动调用)
public int hashCode()
{
return name.hashCode()+age*34;
}
//判断接受的类是不是Person类,不是就抛出异常(底层自动调用)
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
throw new ClassCastException("不是Person类");
Person p = (Person)obj;
return this.name.equals(p.name) && this.age==p.age;
}
public int compareTo(Person p)//(按照自己的要求去作比较)
{
int num=new Integer(this.age).compareTo(p.age);
return num==0?this.name.compareTo(p.name):num;
}
}
public class Test
{
public static <T>void sop(T t) //使用泛型接收参数
{
System.out.println(t);
}
public static void main(String args[]) throws Exception
{
//创建一个map集合,用来存储数据 <>表示接收的是泛型,即指定的类型
TreeMap<Person,String> map = new TreeMap<Person,String>(/*new Mycompare()*/); //也可以使用这个被注释掉的自定义的比较器
//往集合添加数据
map.put(new Person("czhangsan1",11),"beijing");
map.put(new Person("zhangsan5",15),"nanjing");
map.put(new Person("azhangsan5",10),"shanghai");
map.put(new Person("zhangsan2",20),"haierbing");
map.put(new Person("bzhangsan2",20),"beijing");
map.put(new Person("zhangsan3",12),"shanghai");
map.put(new Person("zhangsan4",19),"changchun");
map.put(new Person("zhangsan4",10),"changchun");
map.put(new Person("zhangsan4",10),"zhengzhou");
//将map集合转换为set集合,因为map集合没有迭代器 ,而set集合有
Set<Map.Entry<Person,String>> entryset = map.entrySet();
//获取迭代器
Iterator<Map.Entry<Person,String>> it = entryset.iterator();
//用迭代器取数据
while(it.hasNext())
{
Map.Entry<Person,String> m = it.next();
Person key = m.getKey();//取出键
String value =m.getValue();//取出值
sop(key+"......."+"adress:"+value);//打印键和值
}
}
}
class Mycompare implements comparator<Perosn>//自定义一个比较器
{
public int compare(Person p1,Person p2)
{
int num = p1.getName().compareTo(p2.getName());
return num==0?new Integer(p1.getAge()).compareTo(new Integer(p2.getAge())):num;
}
}
//注意:上面的两种形式都实现了比较,任选其中一种就可以。要么实现comparable接口;要么在集合中传入自定义的比较器。
import java.util.*; public class Person implements Comparable<Person>//使Person的属性具有比较性 { private String name; private int age; public Person(String name,int age)//初始化构造函数 { this.name = name; this.age = age; } public void set(String name,int age)//重新设置姓名和年龄 { this.name = name; this.age = age; } public String getName()//获取姓名 { return name; } public int getAge()//获取年龄 { return age; } public String toString()//将姓名和年龄以字符串的形式返回 { return name+","+age; } //出现重名时,再找到另一个hash地址用来存储数据(底层自动调用) public int hashCode() { return name.hashCode()+age*34; } //判断接受的类是不是Person类,不是就抛出异常(底层自动调用) public boolean equals(Object obj) { if(!(obj instanceof Person)) throw new ClassCastException("不是Person类"); Person p = (Person)obj; return this.name.equals(p.name) && this.age==p.age; } public int compareTo(Person p)//(按照自己的要求去作比较) { int num=new Integer(this.age).compareTo(p.age); return num==0?this.name.compareTo(p.name):num; } } public class Test { public static <T>void sop(T t) //使用泛型接收参数 { System.out.println(t); } public static void main(String args[]) throws Exception { //创建一个map集合,用来存储数据 <>表示接收的是泛型,即指定的类型 TreeMap<Person,String> map = new TreeMap<Person,String>(/*new Mycompare()*/); //也可以使用这个被注释掉的自定义的比较器 //往集合添加数据 map.put(new Person("czhangsan1",11),"beijing"); map.put(new Person("zhangsan5",15),"nanjing"); map.put(new Person("azhangsan5",10),"shanghai"); map.put(new Person("zhangsan2",20),"haierbing"); map.put(new Person("bzhangsan2",20),"beijing"); map.put(new Person("zhangsan3",12),"shanghai"); map.put(new Person("zhangsan4",19),"changchun"); map.put(new Person("zhangsan4",10),"changchun"); map.put(new Person("zhangsan4",10),"zhengzhou"); //将map集合转换为set集合,因为map集合没有迭代器 ,而set集合有 Set<Map.Entry<Person,String>> entryset = map.entrySet(); //获取迭代器 Iterator<Map.Entry<Person,String>> it = entryset.iterator(); //用迭代器取数据 while(it.hasNext()) { Map.Entry<Person,String> m = it.next(); Person key = m.getKey();//取出键 String value =m.getValue();//取出值 sop(key+"......."+"adress:"+value);//打印键和值 } } } class Mycompare implements comparator<Perosn>//自定义一个比较器 { public int compare(Person p1,Person p2) { int num = p1.getName().compareTo(p2.getName()); return num==0?new Integer(p1.getAge()).compareTo(new Integer(p2.getAge())):num; } } //注意:上面的两种形式都实现了比较,任选其中一种就可以。要么实现comparable接口;要么在集合中传入自定义的比较器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架