资讯专栏INFORMATION COLUMN

Java Comparable vs Comparator

KitorinZero / 2085人阅读

摘要:和方法可以对数组进行排序,但是这种方法排序要求对象所在的类必须实现接口,此接口用于指定排序规则如果一个类已经开发完成,但是在此类建立的初期并没有实现接口,此时肯定是无法进行对象排序操作的,所以为了解决这个问题,定义了另一个比较器的操

Collections.sort() 和 Arrays.sort()方法可以对Object数组进行排序,但是这种方法排序要求对象所在的类必须实现Comparable接口,此接口用于指定排序规则

</>复制代码

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class HDTV implements Comparable {
  5. private int size;
  6. private String brand;
  7. public HDTV(int size, String brand) {
  8. this.size = size;
  9. this.brand = brand;
  10. }
  11. public int getSize() {
  12. return size;
  13. }
  14. public void setSize(int size) {
  15. this.size = size;
  16. }
  17. public String getBrand() {
  18. return brand;
  19. }
  20. public void setBrand(String brand) {
  21. this.brand = brand;
  22. }
  23. @Override
  24. public int compareTo(HDTV tv) {
  25. if (this.getSize() > tv.getSize())
  26. return 1;
  27. else if (this.getSize() < tv.getSize())
  28. return -1;
  29. else
  30. return 0;
  31. }
  32. public static void main(String[] args) {
  33. HDTV tv1 = new HDTV(55, "Samsung");
  34. HDTV tv2 = new HDTV(60, "Sony");
  35. HDTV tv3 = new HDTV(35, "Apple");
  36. List list = new ArrayList();
  37. list.add(tv1);list.add(tv2);list.add(tv3);
  38. Collections.sort(list);
  39. for (HDTV tv : list) {
  40. System.out.println(tv.getSize()+"---"+tv.getBrand());
  41. }
  42. }

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这个问题,java定义了另一个比较器的操作接口--Comparator

</>复制代码

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. class HDTV {
  5. private int size;
  6. private String brand;
  7. public HDTV(int size, String brand) {
  8. this.size = size;
  9. this.brand = brand;
  10. }
  11. public int getSize() {
  12. return size;
  13. }
  14. public void setSize(int size) {
  15. this.size = size;
  16. }
  17. public String getBrand() {
  18. return brand;
  19. }
  20. public void setBrand(String brand) {
  21. this.brand = brand;
  22. }
  23. }
  24. class SizeComparator implements Comparator {
  25. @Override
  26. public int compare(HDTV tv1, HDTV tv2) {
  27. int tv1Size = tv1.getSize();
  28. int tv2Size = tv2.getSize();
  29. if (tv1Size > tv2Size) {
  30. return 1;
  31. } else if (tv1Size < tv2Size) {
  32. return -1;
  33. } else {
  34. return 0;
  35. }
  36. }
  37. }
  38. public class Main {
  39. public static void main(String[] args) {
  40. HDTV tv1 = new HDTV(55, "Samsung");
  41. HDTV tv2 = new HDTV(60, "Sony");
  42. HDTV tv3 = new HDTV(42, "Panasonic");
  43. ArrayList al = new ArrayList();
  44. al.add(tv1);
  45. al.add(tv2);
  46. al.add(tv3);
  47. Collections.sort(al, new SizeComparator());
  48. for (HDTV a : al) {
  49. System.out.println(a.getBrand());
  50. }
  51. }

}

总结:
Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为

参考:Comparable vs Comparator in Java

其他资料:
Comparable与Comparator的区别

Java Sorting: Comparator vs Comparable Tutorial

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64150.html

相关文章

  • Java ComparatorComparable辨析

    摘要:与辨析声明文章均为本人技术笔记,转载请注明出处比较三种状态根据需求定义序升序降序返回负数,表示比较两元素满足序,无须调整,返回,表示比较两元素相等,无须调整位置,返回正数,表示比较两元素不满足序,按序调整位置对象内部排序源码继承接口的对象必 Comparator与Comparable辨析 声明 文章均为本人技术笔记,转载请注明出处:[1] https://segmentfault.co...

    wenhai.he 评论0 收藏0
  • Comparable and Comparator

    摘要:中的一切类都是继承于,在中实现了函数所以,其它所有的类也相当于都实现了该函数。是比较和的大小。返回负数,意味着比小返回零,意味着等于返回正数,意味着大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序实现Comparable接口的类的对象的List列表(或数组) 换而言之, 如果数组或列表想支持...

    Barrior 评论0 收藏0
  • Java™ 教程(对象排序)

    对象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它将按字母顺序排序,如果它由Date元素组成,它将按时间顺序排序,这是怎么发生的?String和Date都实现了Comparable接口,Comparable实现为类提供了自然的顺序,允许该类的对象自动排序,下表总结了一些实现Comparable的更重要的Java平台类。 类 自然...

    Chao 评论0 收藏0
  • java comparablecomparator

    摘要:一内部排序接口实现该接口的类,支持自然排序内排序。方法与方法不一致。在有序集合看来和是相等的,因此第个键无法被添加到集合中。 一、Comparable(内部排序接口) 实现该接口的类,支持自然排序(内排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求对象必须实现Comparable接口 文档中指出: 如果该对象大于指定对象,返回...

    why_rookie 评论0 收藏0
  • Java TreeMap 源码解析

    摘要:源码剖析由于红黑树的操作我这里不说了,所以这里基本上也就没什么源码可以讲了,因为这里面重要的算法都是,这里的是指,他们是算法导论的作者,也就是说里面算法都是参照算法导论的伪代码。因为红黑树是平衡的二叉搜索树,所以其包含操作的时间复杂度都为。 本文章首发于个人博客,鉴于sf博客样式具有赏心悦目的美感,遂发表于此,供大家学习、批评。本文还在不断更新中,最新版可移至个人博客。? 继上篇文章...

    rubyshen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<