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接口;要么在集合中传入自定义的比较器。
 
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4710550.html,如需转载请自行联系原作者
目录
相关文章
测试闭环
一、需求评审 1.需求评审的目的 明确功能优先级,评审业务流程设计的合理性,评估技术可行性。 2.需求评审中注意事项 a)提前了解产品需求,明确核心流程、功能结构 b)评审过程中不避免乏味,时间越长越容易分心,所以先了解重点模块,循序渐进 c)评审中遇到争议点,避免发散讨论,引导大家快速决策,明确沟通,明确产品拍板 d)评审中遇到无法决策的点,记录下来,会后处理,不过多纠缠,后续让产品决策后更新需求文档。
4016 0
|
安全 芯片
USB输入过压保护芯片,短路保护,适用于5V,6V,型号齐全0.5A-6A
USB输入过压保护芯片用于防止低质量USB充电器造成的高压损害及快充时的瞬间尖峰电压,确保设备安全。该系列芯片耐压40V-70V,内阻低,适用于不同电流需求,如PW2605适合0.5A,PW2609A适合1A-3A,并集成过压保护与限流功能,提升产品可靠性。
USB输入过压保护芯片,短路保护,适用于5V,6V,型号齐全0.5A-6A
|
编解码 算法 数据可视化
lintsampler:高效从任意概率分布生成随机样本的新方法
在实际应用中,从复杂概率密度函数(PDF)中抽取随机样本的需求非常普遍,涉及统计估计、蒙特卡洛模拟和物理仿真等领域。`lintsampler` 是一个纯 Python 库,旨在高效地从任意概率分布中生成随机样本。它通过线性插值采样算法,简化了复杂分布的采样过程,提供了比传统方法如 MCMC 和拒绝采样更简便和高效的解决方案。`lintsampler` 的设计目标是让用户能够轻松生成高质量的样本,而无需复杂的参数调整。
252 1
lintsampler:高效从任意概率分布生成随机样本的新方法
智谱 AI 大模型
智谱是清华大学技术成果转化公司,推出中英双语千亿级大模型 GLM-130B、对话模型 ChatGLM、开源模型 ChatGLM-6B、AI 提效助手智谱清言、高效率代码模型 CodeGeeX、多模态理解模型 CogVLM、文生图模型 CogView 和文生视频模型 CogVideo。是国内开源大模型的领先者,大模型领域的经典成功商业案例。
|
数据采集 算法 网络架构
英伟达开源大模型FoundationPose称霸BOP排行榜
【4月更文挑战第10天】英伟达新推出的FoundationPose模型在6D对象姿态估计和跟踪上取得重大突破,荣登BOP排行榜首。该模型以统一框架兼容有模型和无模型设置,利用大规模合成数据和对比学习提高泛化能力,且在复杂场景中表现出高适应性。尽管在处理某些困难情况时仍有局限,如无纹理物体的定位,但它展示了巨大的潜力和对未来技术的启示。
460 1
英伟达开源大模型FoundationPose称霸BOP排行榜
|
SQL 关系型数据库 MySQL
sql数据库同步软件
SQL数据库同步软件有多种选择,以下是一些常见的工具: * SQL Data Compare:此工具可以帮助在SQL Server或Azure SQL数据库之间进行数据比较和同步。它能够自动检测
|
JavaScript Java 测试技术
基于微信小程序的二手物品交易平台ssm附带文章和源代码设计说明文档ppt
基于微信小程序的二手物品交易平台ssm附带文章和源代码设计说明文档ppt
292 0
|
机器学习/深度学习 人工智能 算法
|
Ubuntu Linux 网络安全
Xftp无法与192.168.xx.xx连接 && SSH服务器拒绝了密码。请再试一次。
Xftp无法与192.168.xx.xx连接 && SSH服务器拒绝了密码。请再试一次。
884 0
|
弹性计算 并行计算 数据库
阿里云GPU服务器租用费用价格表(多配置报价)
阿里云GPU服务器优惠3折GPU云服务器vgn6i优惠价469.46元/月起,GPU云服务器gn6i和GPU云服务器gn6v均有活动,NVIDIA T4及V100均有活动
4129 0
阿里云GPU服务器租用费用价格表(多配置报价)