`

compare接口

    博客分类:
  • java
阅读更多

http://bluelzx.iteye.com/blog/200987

1. 两种比较接口分析 在 “ 集合框架 ” 中有两种比较接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。 前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。 一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。 而 Comparator 的作用有两个: 1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序; 2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。 2 Comparable 接口 public interface Comparable { 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 { 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 set = new TreeSet(); 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 map = new TreeMap(); 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 { int compare(T o1, T o2); boolean span

分享到:
评论
1 楼 BruseLee 2011-10-08  
写的什么破玩意

相关推荐

    Compare用法Compare用法Compare用法

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

    cloudcompare.2.11.3

    6. **脚本与插件扩展**:CloudCompare提供脚本接口,允许用户编写自定义脚本来自动化处理流程,或者通过编写插件来扩展其功能。 7. **GIS集成**:具备地理信息系统(GIS)功能,可以处理带有地理坐标信息的点云,...

    list排序 Icompare接口

    `IComparer<T>`接口包含一个方法:`Compare(T x, T y)`。这个方法返回一个整数值,表示`x`和`y`的相对顺序。如果`x`小于`y`,返回负数;如果`x`等于`y`,返回零;如果`x`大于`y`,返回正数。在实现`IComparer<T>`时...

    CloudCompare的源代码

    源代码中的模块化设计使得这部分工作变得相对容易,只需要遵循已有的编程规范和接口设计即可。 总之,CloudCompare的源代码是一份宝贵的学习资源,无论你是想深入理解3D点云处理、图形界面设计还是进行软件开发,都...

    ComparePlugin_v2.0.0_x86-x64-code.zip

    源码通常包括C++或其他编程语言编写的类库,这些类库实现了与Notepad++接口的交互,以及文件比较的具体算法。通过阅读和分析源码,我们可以了解到插件如何集成到Notepad++的事件处理机制中,以及如何高效地比较和...

    负责排序的程序包

    在方法一中,可能可以定义一个Compare接口,包含isGreaterThan()和isLessThan()等方法,用于比较元素大小。 - **抽象类(Abstract Class)**:Sorter类被声明为抽象类,包含了sort方法的抽象定义,以及非抽象方法如...

    BeyondCompare3.zip

    6. 强大的脚本支持:对于高级用户,Beyond Compare 3提供了命令行工具和脚本接口,可以集成到自动化工作流程中,实现批量对比和同步任务。 7. 多语言支持:Beyond Compare 3不仅界面友好,还支持多种语言,包括简体...

    Beyond Compare_beyondcompare_beyondcomparexml_文件比较器_

    8. **脚本化操作**:通过命令行接口,Beyond Compare可以被集成到自动化脚本中,实现批量的文件或文件夹比较任务。 9. **报告生成**:对比结果可以导出为HTML或文本报告,便于分享和存档。 在实际使用中,"Beyond ...

    java Compare示例

    `Comparator`接口同样有一个`compare(T o1, T o2)`方法,用来比较两个对象。通常,我们会在需要定制排序逻辑的场景中使用`Comparator`,比如在集合框架中的排序操作。 ```java List<String> list = Arrays.asList(...

    CloudCompare

    对于高级用户,深入理解其内部算法和编程接口,可以实现更多高级功能。社区论坛是获取帮助和分享经验的良好平台,也有众多插件和脚本资源可供探索和使用。 总之,CloudCompare是一款强大且易用的点云处理软件,无论...

    compare

    标题“compare”可能指的是在IT领域中比较两个对象或数据结构的过程,这通常涉及到编程中的逻辑和算法。在这个场景下,我们可能是在讨论如何比较不同的数据类型,如字符串、数字或者自定义对象,或者是在比较文件、...

    在cn.com.my包中,封装一个接口Sortable,包括一个抽象方法int compare( Sortable s),表示需要进行比较大小

    在cn.com.my包中,封装一个接口Sortable,包括一个抽象方法int compare( Sortable s),表示需要进行比较大小,返回正数则表示大于,返回负数则表示小于,返回0则表示等于。封装一个类Student,要求实现此接口,必须...

    BOM Compare Utility_AUTOITEXCEL比对_bom比对_

    使用AutoIt进行Excel比对的优点在于,它可以轻松地与Excel接口,无需深入了解VBA(Visual Basic for Applications)等复杂编程语言。 关于"BOM Compare Utility.au3"这个文件,它是AutoIt脚本的源代码文件。用户...

    comparator接口与Comparable接口的区别

    实现Comparator接口需要覆盖compare()方法,以便比较两个对象的大小。例如,我们可以定义一个PersonComparator类,并实现Comparator接口,并覆盖compare()方法,以便比较Person类的对象的大小。 应用场景:...

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

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

    CloudCompare2.6.3功能20190905.pdf

    - 插件模块提供了一套扩展接口,允许用户安装和管理第三方插件,以增强CloudCompare的功能。 ### 六、3DViews——3D视角 - **New——新建视图**:创建一个新的3D视图窗口。 - **Zoomin——放大**:增加视图的缩放...

    C#泛型接口实例

    这里的`where T : IComparable<T>`表示`T`必须实现`IComparable<T>`接口,这样我们就可以在`Compare`方法中安全地使用`CompareTo`方法。 三、多态性与泛型接口 泛型接口提供了多态性,使得可以创建通用的算法和...

    CloudCompare-master_cloudcompare_点云_源码.zip

    源码中包含插件接口和加载机制,开发者可以通过编写C++插件扩展软件功能。 8. **数据管理**:源码中包含了对点云数据的高效存储和检索策略,如分块加载、索引构建等,以优化大模型的处理性能。 9. **脚本支持**:...

    Beyond Compare

    9. 脚本化操作:通过命令行接口,Beyond Compare可以被集成到自动化脚本中,实现批量的文件比对和同步任务。 10. 多语言支持:Beyond Compare支持多种语言界面,方便全球用户使用。 总结来说,Beyond Compare是一...

    Comparable接口和Comparator使用示例

    在 CompareTest 类中,我们实现了 compare() 方法,该方法用于比较两个 Simple 对象的年龄,并返回一个整数值,该值表示第一个对象是否小于、等于或大于第二个对象。 在 main() 方法中,我们创建了一个 Simple 对象...

Global site tag (gtag.js) - Google Analytics