当前位置: 首页 > news >正文

四川市网站建设龙岗网站设计公司

四川市网站建设,龙岗网站设计公司,建设医疗网站,广东微信网站制作价格Comparable和Comparator接口都是实现集合中元素的比较、排序的,下面先简单介绍下他们的用法。 1. 使用示例 public class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name name;this.ag…

Comparable和Comparator接口都是实现集合中元素的比较、排序的,下面先简单介绍下他们的用法。

1. 使用示例

public class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Person o) {return  this.age - o.age;}
}
        ArrayList<Person> list = new ArrayList<>();list.add(new Person("朱一百",100));list.add(new Person("朱八零",80));list.add(new Person("朱八一",81));list.add(new Person("朱九零",90));list.add(new Person("朱八二",82));list.add(new Person("朱七七",77));list.add(new Person("朱八八",88));list.add(new Person("朱重八",88));

1.1 Comparable

public class Person  implements Comparable<Person>{......@Overridepublic int compareTo(Person o) {if (this.getAge() < o.getAge()) {return -1;} else if (this.getAge() > o.getAge()) {return 1;} else {return this.getName().compareTo(o.getName());}}
}
public class ComparableTest {public static void main(String[] args) {......Collections.sort(list);list.forEach(System.out::println);}
}

1.2 Comparator

public class PersonComparator  implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {if (o1.getAge() < o2.getAge()) {return -1;} else if (o1.getAge() > o2.getAge()) {return 1;} else {return o1.getName().compareTo(o2.getName());}}
}
public class ComparatorTest {public static void main(String[] args) {......Collections.sort(list,new PersonComparator());list.forEach(System.out::println);}
}

以上的两个例子输出的结果如下所示:

Person{name='朱七七', age=77}
Person{name='朱八零', age=80}
Person{name='朱八一', age=81}
Person{name='朱八二', age=82}
Person{name='朱八八', age=88}
Person{name='朱啊八', age=88}
Person{name='朱九零', age=90}
Person{name='朱一百', age=100}

按照年龄升序排列,年龄相同时按照姓名升序排序。

2. 关于返回结果-1 0 1 和排序的关系

在上面的例子中我们分别实现了compare()compareTo()对集合继续宁排序,但是我们想知道方法返回-1、0、1对集合排序的关系。

2.1 Comparable

List#sort() =>ArrayList#sort() => Arrays#sort() ⇒ ComparableTimSort#sort() ⇒ ComparableTimSort.#countRunAndMakeAscending()
ArrayList#sort()
可以看到到Comparator c == null 时进入sort() 方法,当我们实现Comparator进行排序时,进入的方法就应该是 TimSort.sort()
Arrays#sort()
ComparableTimSort#sort()
ComparableTimSort.#countRunAndMakeAscending()
countRunAndMakeAscending方法如下:

    private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {assert lo < hi;int runHi = lo + 1;if (runHi == hi)return 1;if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descendingwhile (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0)runHi++;reverseRange(a, lo, runHi);} else {                              // Ascendingwhile (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) >= 0)runHi++;}return runHi - lo;}

如果当前子序列是"递减"的,也就是 a[runHi] 小于 a[lo],那么需要找到连续"递减"的子序列的结束位置 runHi。直到找到第一个不满足"递减"条件的元素。然后,调用 reverseRange 方法将"递减"的子序列反转为"递增"的子序列。

如果当前子序列是"递增"的,也就是 a[runHi] 大于等于 a[lo],那么需要找到连续"递增"的子序列的结束位置 runHi。
最后,返回 runHi - lo,即子序列的长度。

    private static void binarySort(Object[] a, int lo, int hi, int start) {assert lo <= start && start <= hi;if (start == lo)start++;for ( ; start < hi; start++) {Comparable pivot = (Comparable) a[start];int left = lo;int right = start;assert left <= right;/** Invariants:*   pivot >= all in [lo, left).*   pivot <  all in [right, start).*/while (left < right) {int mid = (left + right) >>> 1;// pivot元素的索引比a[mid]的索引大// pivot元素在数组中比a[mid]靠后if (pivot.compareTo(a[mid]) < 0)right = mid;elseleft = mid + 1;}assert left == right;int n = start - left;  // The number of elements to move// Switch is just an optimization for arraycopy in default caseswitch (n) {case 2:  a[left + 2] = a[left + 1];case 1:  a[left + 1] = a[left];break;default: System.arraycopy(a, left, a, left + 1, n);}a[left] = pivot;}}

这个方法做的事情如下:

  1. 经过countRunAndMakeAscending()方法 start位置之前的集合是有序的,于是start位置开始,pivot=array[start],使用二分查找法对start之前已经有序的数组比对,从start下标开始从后往前找,找到start下标之前第一个大于array[start]的元素下标index;
  2. 根据要移动的步数n = start - left做了优化,但是目的是将[left, start-1]范围内的数组值都向后移动一位,放在 [left+1~start],再把pivot的值赋予array[left];
  3. start++,循环执行以上步骤直到数组结束

总结

我们实现的compareTo()方法返回-1 0 1 和集合的排序是升序或者降序没有直接的关系,在上面的方法我们可以看到的是compareTo()返回会导致如下结果:

  1. 返回-1说明两个比较的元素需要交换位置
  2. 但会0或者1不需要交换两个元素的位置

所以我们应该能比较清楚的知道返回-1 0 1 给我们排序带来的效果了,比如上方的pivot.compareTo(a[mid]) pivot在数组中比a[mid]靠后,当 if (this.getAge() < o.getAge()) {return -1}; 我们希望pivot的age小于a[mid]时交换位置,最后排序的结果就是年龄的升序,如果if (this.getAge() < o.getAge()) {return 1};最后排序的结果就是年龄的降序

http://www.yayakq.cn/news/990095/

相关文章:

  • 微信链接的微网站怎么做的住房和城乡建设厅焊工证
  • 建站之星破解版下载微信服务号开发
  • 文明校园建设专题网站长沙微网站建设
  • 有网站和无网站的区别肥乡县建设局网站
  • 公司网站建设维护wordpress 柚子皮
  • 网站作品广州微信小程序开发制作公司
  • 制作网站需要注意的细节陕西建设网官网公示
  • 网站开发流程中网站制作包括WORDPRESS添加全屏幻灯片
  • 网站卖给别人后做违法信息asp无刷新网站模板
  • 怎么做cpa网站网站建设衤金手指下拉10
  • 质量好网站建设商家珠海左右创意园网站开发
  • 商城网站建设流程电子网站建设心得
  • 地方性手机平台微网站南京广告公司黄页
  • 东营城镇建设规划网站代理产品
  • 做公开网站的步骤新媒体运营工资一般多少
  • 找一家秦皇岛市做网站的公司鸿蒙开发语言
  • 网站名是什么discuz做企业网站
  • 做招工的网站排名全国城乡和住房建设厅查询网
  • 网站 服务报价怎么增加网站首页权重
  • 华为模板建站网站上传权限问题
  • 织梦网站模板安装教程网站中留言板怎么做
  • 网站流量如何做制作企业网站的新闻显示
  • 沈阳网站页面设计公司青海网站建设的企业
  • 网站建设费用怎么算wordpress迁移后媒体库丢失
  • 网站编辑应该怎么做深圳龙岗发布通告
  • 重庆网站搭建方案wordpress点击图片直接相册浏览器
  • 怎么查看自己网站有没有被百度收录wordpress禁止访问后台
  • 建设银行网站背景图片北京市文化局政务网站建设项目
  • 北京网站建设app高要市建设局网站
  • 小城镇建设网站并阐述观点ps免费素材网站有哪些