`

java compare 接口

    博客分类:
  • java
阅读更多
1. 两种比较接口分析
集合框架 中有两种比较接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
Comparator 的作用有两个:
1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
2 Comparable 接口
public interface Comparable<T> {
    public int compareTo(T o);
}
java.lang. Comparable 接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。  
1 int compareTo(Object o): 比较当前实例对象与对象 o ,如果位于对象 o 之前,返回负值,如果两个对象在排序中位置相同,则返回 0 ,如果位于对象 o 后面,则返回正值。
 
2 )在 Java 2 SDK 版本 1.4 中有二十四个类实现 Comparable 接口。下表展示了 8 种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
排序
BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
按数字大小排序
Character
Unicode 值的数字大小排序
String
按字符串中字符 Unicode 值排序
利用 Comparable 接口创建自己的类的排序顺序,只是实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖 equals() hashCode() 以确保两个相等的对象返回同一个哈希码。
这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort Arrays.sort 排序,或应用于有序集合 TreeSet TreeMap 中。
下面设计一个有序的类 Person ,它实现 Comparable 接口,以年龄为第一关键字,姓名为第二关键字升序排序。
Person.java
package com.zj.sort.comparable;
 
public class Person implements Comparable<Person> {
    private int age ;
    private String name ;
 
    public Person( int age, String name) {
       this . age = age;
       this . name = name;
    }
 
    public int compareTo(Person person) {
       int cop = age - person.getAge();
       if (cop != 0)
           return cop;
       else
           return name .compareTo(person. name );
    }
 
    public int getAge() {
       return age ;
    }
 
    public String getName() {
       return name ;
    }
 
    public int hashCode() {
       int result = 17;
       result = 37 * result + age ;
       result = 37 * result + name .hashCode();
       return result;
    }
 
    public boolean equals(Object o) {
       if (!(o instanceof Person))
           return false ;
       Person person = (Person) o;
       return ( age == person. age ) && ( name .equals(person. name ));
    }
 
    public String toString() {
       return ( age + "{" + name + "}" );
    }
}
2.1 测试 Arrays.sort ()方法
ArraysSortUnit.java
package com.zj.sort.comparable;
import java.util.Arrays;
import com.zj.compare.Person;
 
public class ArraysSortUnit {
    public static void main(String[] args) {
       Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),
              new Person(30, "Mary" ), new Person(20, "Ada" ),
              new Person(40, "Walton" ), new Person(61, "Peter" ),
              new Person(20, "Bush" ) };
       System. out .println(Arrays.toString (ps));
       Arrays.sort (ps);
       System. out .println(Arrays.toString (ps));
    }
}
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.2 测试 Collections.sort ()方法
CollctionsSortUnit.java
package com.zj.sort.comparable;
import java.util.Arrays;
import java.util.Collections;
import com.zj.compare.Person;
 
public class CollctionsSortUnit {
    public static void main(String[] args) {
       Person[] ps = { new Person(20, "Tom" ), new Person(20, "Jeff" ),
              new Person(30, "Mary" ), new Person(20, "Ada" ),
               new Person(40, "Walton" ), new Person(61, "Peter" ),
              new Person(20, "Bush" ) };
       System. out .println(Arrays.toString (ps));
       Collections.sort (Arrays.asList (ps));
       System. out .println(Arrays.toString (ps));
    }
}
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.3 测试 TreeSet
TreeSetUnit.java
package com.zj.sort.comparable;
import java.util.TreeSet;
import com.zj.compare.Person;
 
public class TreeSetUnit {
    public static void main(String[] args) {
       TreeSet<Person> set = new TreeSet<Person>();
       set.add( new Person(20, "Tom" ));
       set.add( new Person(20, "Jeff" ));
       set.add( new Person(30, "Mary" ));
       set.add( new Person(20, "Ada" ));
       set.add( new Person(40, "Walton" ));
       set.add( new Person(61, "Peter" ));
       set.add( new Person(20, "Bush" ));
       System. out .println(set);
    }
}
结果:
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.4 测试 TreeMap
TreeMapUnit.java
package com.zj.sort.comparable;
import java.util.TreeMap;
import com.zj.compare.Person;
 
public class TreeMapUnit {
    public static void main(String[] args) {
       TreeMap<Person, String> map = new TreeMap<Person, String>();
       map.put( new Person(20, "Tom" ), "Tom" );
       map.put( new Person(20, "Jeff" ), "Jeff" );
       map.put( new Person(30, "Mary" ), "Mary" );
       map.put( new Person(20, "Ada" ), "Ada" );
       map.put( new Person(40, "Walton" ), "Walton" );
       map.put( new Person(61, "Peter" ), "Peter" );
       map.put( new Person(20, "Bush" ), "Bush" );
       System. out .println(map);
    }
}
结果:
{20{Ada}=Ada, 20{Bush}=Bush, 20{Jeff}=Jeff, 20{Tom}=Tom, 30{Mary}=Mary, 40{Walton}=Walton, 61{Peter}=Peter}
3. Comparator 接口
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean
分享到:
评论

相关推荐

    java Compare示例

    这是java的comparable接口和comparator接口的例子

    Java开发技术大全(500个源代码).

    compare.java 演示前缀、后缀自加之间区别的程序 constCharExample.java 演示转义字符 converseNumber.java 逆向输出数字 daffodilNumber.java 求水仙花数 division.java 演示整除结果 errorCompoundVariable....

    ArrayCompare.java

    关于List接口和ArrayList类的使用

    java常用工具类的使用

    此类提供格式化和解析数值的接口。若要格式化当前Locale的数值,可使用其中一个方法: myString = NumberFormat.getInstance().format(myNumber); 若要格式化不同 Locale 的日期,可在调用getInstance方法时指定它...

    java排序代码

    定制排序:在创建TreeSet集合对象时,并提供一个Comparator接口实现类对象与该TreeSet集合关联, 由Comparator实现类对象负责集合元素的排序逻辑。 // 自定义比较器 class MyTreeSetCompartor implements...

    java8集合源码-Java8Example:Java8示例

    compare(String s1, String s2) { return s1.compareTo(s2); } }); Java 8 Collections.sort(names, (s1, s2) -&gt; s1.compareTo(s2)); #Java 8 - Lambda 表达式 句法 parameter -&gt; expression body 可选类型声明 - ...

    ArraySort排序

    ArraySort java数组排序的两种方法:实现Comparator接口,重写compare方法 2实现Comparable接口

    java8stream源码-java8collections:Java8中流的基本介绍

    (带有compare抽象方法)。 当 lambda 是函数式接口抽象方法的实现时,可以如下创建该函数式接口的实例。 例子 Comparator&lt; String &gt; comparator = ( String a, String b) - &gt; { return a . compareTo(b);}; ...

    Java8

    Java中的功能接口是仅包含一个抽象(未实现)方法的接口。 除了单个未实现的方法之外,功能接口还可以包含具有实现的默认方法和静态方法。 带集合的Lambda表达式 如果要自定义排序顺序,请使用Comparator界面,而...

    习----题-Java-Web程序设计教程-[共2页].pdf

    注意实现 Comparator 接口的 compare(Object obj1,Object obj2)函数。 4.以 List 接口对象(ArrayList)为基础建立一个通信录,要求通信录中必须含有编号、姓名, 性别、电话、地址、Email 等。实现该类并包含添加...

    Compare_Object:它是一个示例 java 程序,用于解释比较器和可比较接口的使用

    比较对象 它是一个示例 java 程序,用于解释比较器和可比较接口的使用 执照 版权所有 (c) 2014 GitHub, Inc。有关许可权利和限制,请参阅许可文件 (GNU GPL v2.0)

    Java8新特性

    Java8新特性Java8新特性Lambda表达式函数式接口:方法引用、构造器引用及数组引用Stream APIOptional类 Java8新特性 Lambda表达式 /** * Lambda表达式的使用 * 1.举例:(o1,o2)-&gt;Integer.compare(o1,o2); * 2....

    Java~三种重写compare方法的PriorityQueue、TopK问题的解决思想附练习题(查找最小的K对数字与最后一块石头重量)

    因为在Java库函数里,... //定义一个静态内部类,继承Comparator接口,并重写他的compare方法 //return o2-o1 就可以 @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } pu

    java8源码-Java8:Java8

    java8 源码 Java8 Lambda表达式 λ表达式可以被当做是一个Object(注意措辞)。λ表达式的类型,叫做“目标类型(target type)”。...compare(T o1, T o2); boolean equals(Object obj); } 注意最后这个

    详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,接下来通过本文给大家介绍Java中Collections.sort排序,需要的的朋友参考下吧

    java排序源码

    排序算法,基于compare,comparable接口的使用,使用collection下的sort方法对读取的文件中的内容进行排序,并去重,很不错的简单小程序,谢谢下载

    【05-面向对象(下)】

    •Java 7为所有包装类增加一个新方法: compare(x , y)的方法。该方法用于比较两个包装类实例,当x&gt;y, 返回大于0的数;当x==y,返回0;否则返回小于0的数。 对象的方法 •打印对象和toString方法:...

    day016-list和set笔记以及代码.zip

    如果是定制排序,需要创建TreeSet对象的时候,传入一个Comparetor接口实现类对象,重写compare方法 一般是默认排序用自然排序(Comparable接口),特殊排序用定制排序(Comparetor接口实现) LinkedHashSet:如果...

    Java初识Lambda表达式

    public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); }; }); 这里是在使用Comparator接口实现排序时使用的,使用匿名内部类,重写方法,大概四五行的样子 使用Lambda表达式...

    Eclipse 中文教程

    3.1.4比较/修正(Compare/Patch) 62 3.1.5编辑器(Editors) 64 3.1.6档案关联(File Associations) 65 3.1.7按键(Keys) 67 3.1.8标签装饰(Label Decorations) 73 3.1.9链接资源(Linked Resources) 73 3.1.10历史纪录...

Global site tag (gtag.js) - Google Analytics