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 ,如需转载请自行联系原作者
相关文章
|
12天前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
42 20
|
26天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
45 3
【C++】map、set基本用法
|
2月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
53 1
|
3月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
182 3
|
3月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
140 3
|
3月前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
86 3
|
3月前
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
43 2
|
3月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
34 2
|
Java
【Java】Comparable和Comparator接口
【Java】Comparable和Comparator接口
499 0
【Java】Comparable和Comparator接口

热门文章

最新文章