`
sdustyongz
  • 浏览: 89688 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java compare 接口介绍

阅读更多
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}
分享到:
评论

相关推荐

    java Compare示例

    在Java编程语言中,`Comparable`接口和`Comparator`接口是用于对象排序的关键工具。这两个接口都涉及到...在阅读提供的"javaCompare"文件时,你将深入理解这两个接口的用法和实现细节,进一步提升你的Java编程技能。

    Java API接口详述.rar

    例如,`java.util.Comparator`接口定义了一个比较两个对象的方法`compare(T o1, T o2)`,使得任何类实现了这个接口就必须提供比较逻辑。 Java API中的主要接口包括: 1. `java.io.Serializable`: 使类的对象能够...

    java接口与实现接口的类实验报告.pdf

    `Comparator&lt;T&gt;`是Java.util包中的一个接口,它提供了一个`compare(T o1, T o2)`方法,用于比较两个对象的顺序。 实验中,创建了三个实现Comparator接口的类:CompareName、CompareBirthday和CompareAge。每个类都...

    Compare用法Compare用法Compare用法

    在Java中,`compare`方法是`Comparator`接口的一个核心方法,用于自定义对象的比较规则。用户可以创建自己的`Comparator`实现来比较特定类型的对象。另外,`Comparable`接口也包含`compareTo`方法,用于比较类的实例...

    Java 比较接口comparable与comparator区别解析

    Java 比较接口comparable与comparator区别解析 Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细...

    java集合某个字段按照中文拼音排序.docx

    对Java集合中的某个字段按照中文拼音排序可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用Comparable接口 在Java中,我们可以使用Comparable接口来实现自定义排序。例如,我们可以创建一个Record类,...

    java接口与实现接口的类实验报告.docx

    【Java接口与实现接口的类】实验报告详细解析 在Java编程中,接口(Interface)是一种定义行为规范的抽象类型,它允许类实现多个接口,从而实现多继承。本实验旨在帮助学生深入理解接口的概念以及如何在实际编程中...

    java8-函数式接口.pdf

    Java 8引入了函数式接口的概念,这是一项重要的更新,旨在支持函数式编程风格。函数式接口是指只有一个抽象方法的接口,这样的设计使得接口能够被用作 Lambda 表达式的类型。Lambda 表达式是一种简洁的匿名函数表示...

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

    示例描述:本章介绍开发Java的基础语法知识。 accumulationByDoWhile.java 用do~while语句写的累加程序 accumulationByFor.java 用for语句写的累加程序 accumulationByWhile.java 用while语句写的累加程序 ...

    显示compare()方法用法的Java程序.docx

    在Java编程语言中,`compare()`方法是`Comparator`接口的一部分,它用于比较两个对象的顺序。这个方法在实现排序算法、数据结构如`TreeSet`和`TreeMap`,以及自定义对象的排序逻辑时非常有用。在这个文档中,我们将...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    Java8HashMap键与Comparable接口编程开

    Comparable接口是Java中用于定义对象之间自然顺序的接口,它只有一个方法`compareTo(T o)`,用于比较当前对象与指定对象的大小关系。当一个类实现了Comparable接口,那么它的实例就可以进行排序,比如在集合框架中...

    Java 8 简明教程

    例如,`Comparator&lt;T&gt;` 接口就是一个典型的函数式接口,因为它只包含一个抽象方法 `compare(T o1, T o2)`。因此,它可以被 Lambda 表达式所实现。 ```java Comparator&lt;String&gt; reverseOrder = (a, b) -&gt; b....

    Comparable接口和Comparator使用示例

    在本文中,我们将通过实例代码,详细介绍 Comparable 接口和 Comparator 的使用示例。 Comparable 接口 Comparable 接口是 Java 中的一个接口,它提供了一个通用的比较机制,允许对象之间进行比较。实现 ...

    java 中文姓氏 排序

    本文将详细介绍如何在 Java 中对包含中文姓氏的对象列表或字符串列表进行排序。 #### 二、基本概念 1. **Collator 类**:这是 Java 中用于文本排序和检索的标准类。`Collator` 类提供了与语言环境相关的字符串排序...

    java 8快速入门

    Lambda表达式是Java 8中引入的一种新的语法元素,用于实现函数式接口,即具有单一抽象方法的接口。Lambda表达式为Java添加了函数式编程的能力,使得开发者可以编写更简洁的代码,特别是在处理集合(Collection)和多...

    JAVA 比较器实例

    Java比较器是一个接口,位于`java.util`包下,其主要作用是提供一种方式来定义对象之间的比较规则。当我们需要对非原始类型(如自定义类的对象)进行排序时,由于它们可能没有天然的比较规则(如数字的大小),就...

    java8 代码参考

    此外,`java.util.function`包提供了大量预定义的函数接口,如`Predicate`、`Function`、`Supplier`等,用于支持高阶函数和函数组合。 三、Stream API Stream API是一种新的数据处理方式,它允许开发者以声明式的...

    java Comparator 用法 例子

    Java中的Comparator接口是排序的关键工具,它允许程序员自定义对象的比较规则,从而在集合、数组或树结构(如TreeSet、TreeMap)中实现定制化的排序。在Java的Collections框架中,Comparator扮演着重要的角色,特别...

    java比较器Comparable接口与Comaprator接口的深入分析

    Java中的比较器主要涉及到两种接口:Comparable接口和Comparator接口,它们在处理对象排序时起着关键作用。 **Comparable接口** Comparable接口是Java.lang包下的一个接口,它只有一个方法:compareTo(T o)。当一个...

Global site tag (gtag.js) - Google Analytics