博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)
阅读量:6831 次
发布时间:2019-06-26

本文共 4893 字,大约阅读时间需要 16 分钟。

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的属性具有比较性{ 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
void sop(T t) //使用泛型接收参数 { System.out.println(t); } public static void main(String args[]) throws Exception { //创建一个map集合,用来存储数据 <>表示接收的是泛型,即指定的类型 TreeMap
map = new TreeMap
(/*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
> entryset = map.entrySet(); //获取迭代器 Iterator
> it = entryset.iterator(); //用迭代器取数据 while(it.hasNext()) { Map.Entry
m = it.next(); Person key = m.getKey();//取出键 String value =m.getValue();//取出值 sop(key+"......."+"adress:"+value);//打印键和值 } } } class Mycompare implements comparator
//自定义一个比较器{ 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://itjkl.baihongyu.com/

你可能感兴趣的文章
python multiprocess不能完全关闭socket的验证
查看>>
深入解读ESB与SOA的关系
查看>>
冒泡排序和选择排序
查看>>
Add Auto Login computer by Registy(自动登陆计算机通过增加注册表键值方法)
查看>>
Python 标准库中的装饰器
查看>>
数论12——浅谈指数与对数
查看>>
几种重要的网络演化模型
查看>>
override与重载(overload)的区别
查看>>
maven项目 jsp报错
查看>>
UVA699 dfs and map
查看>>
###20175311MyCP(课下作业,必做)
查看>>
WCF 第二章 契约 同步请求回复操作
查看>>
Python3 Socket网络编程
查看>>
山泉戒
查看>>
Message Decoding
查看>>
EL表达式产生了DOM对象
查看>>
iOS开发数据库篇—FMDB简单介绍
查看>>
app测试更多机型系统解决方法
查看>>
winxp sp2下安装.net framework失败解决方法
查看>>
python-pcap模块解析mac地址
查看>>