Java—Sort排序
Java中Sort排序是⾮常常⽤的⽅法,这⼀章我们主要来认识⼀下Sort的⽤法和相关的实现。
⼀、数组Sort排序
升序排序,直接使⽤Arrays.Sort⽅法,例如:
int[] array = {10, 3, 6, 1, 4, 5, 9};
//正序排序
Arrays.sort(array);//会检查数组个数⼤于286且连续性好就使⽤归并排序,若⼩于47使⽤插⼊排序,其余情况使⽤双轴快速排序
System.out.println("升序排序:");
for (int num : array) {
System.out.println(num);
}
降序排序,对于只输出数组的情况,可以倒叙循环访问,例如:
//倒序排序
//(1)由于不提供倒排⽅法,你可以倒叙输出
System.out.println("降序输出:");
for (int i = array.length - 1; i >= 0; i--) {
System.out.println(array[i]);
}
降序排序,对于需要使⽤数组 的情况,可以创建⼀个新的数组,然后倒叙访问赋值,例如:
//(2)或者创建⼀个新的数组,倒叙保存到新数组
int[] descArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
descArray[i] = array[array.length - i - 1];
java的tostring方法}
System.out.println("新数组降序输出:");
for (int num : descArray) {
System.out.println(num);
}
降序排序,可以先将数组转为集合,然后使⽤verse()反转集合,但是对于⾮引⽤类型,不可以使⽤Arrays.asList(),因为int[]会被当作⼀个类型,⽽不是数组。
所以可以使⽤Guava的Ints.asList()⽅法实现,该转换后的集合,实现了List接⼝的⽅法,直接将数组转⼊内部的数组变量,需要注意它并没有实现数组的操作⽅法,例如调⽤add会报错:
转换和排序例如:
//(3)或者使⽤Guava来实现
List<Integer> integersList = Ints.asList(array);
System.out.println("Guava降序输出:");
for (int num : integersList) {
System.out.println(num);
}
转后的集合类是Guava中的IntArrayAsList,其类UML图如下:
⼆、集合Sort排序—包装类
本⼩节主要是对jdk类库中的包装类排序,例如:Integer、String等,这些类都已经重写了Compare⽅法,都有默认排序规则,例如对于Integer类型会⽐较其包装的值类型⼤⼩,对于String类型会以长度最⼩字符串为基准,逐⼀⽐较相同位置字符的ASCII码⼤⼩,如果都相同则⽐较字符串的长度。
以Integer为例⼦,升序排序:
//Integer集合,正序排序
List<Integer> list = new ArrayList<Integer>(Arrays.asList(10, 3, 6, 1, 4, 5, 9));
Collections.sort(list);
System.out.println("集合正序排序:");
for (Integer num : list) {
System.out.println(num);
}
返回:
集合正序排序:
1
3
4
5
6
9
10
降序排序:
//倒叙排序
Comparator<Integer> reverseComparator = verseOrder();
Collections.sort(list, reverseComparator);
System.out.println("集合倒叙排序:");
for (Integer num : list) {
System.out.println(num);
}
返回:
集合倒叙排序:
10
9
6
5
4
3
1
三、集合Sort排序—⾃定义对象
除了两节所描述的情况,我们还会遇到对于⾃定义类排序的情况,例如我们现在有⼀个学⽣对象,想要根据年龄对其进⾏排序,学⽣类Student如下:
public class Student {
private String name;
private Integer age;
public Student(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;
}
/**
* 为了更好显⽰数据,我们重写toString()⽅法.
* @return 显⽰变量的字符串
*/
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
(1) 第⼀种⽅式,是实现Comparable接⼝,重写接⼝⽅法。
该CompareTo()⽅法,如果指定的数与参数相等返回0;如果指定的数⼩于参数返回 -1;如果指定的数⼤于参数返回 1。
对于排序来讲,你可以认为当返回1时,指定的数和参数会进⾏交换,⽽⾮1时则不变,指定数可以当作原本的数组中靠前的数,⽽参数可以当作靠后的数,⼜因为只有靠前数⼤于靠后数时才返回1,所以⼤的会被放到后⾯,此时升序排序(⽅便记忆)。以此类推,倒序情况则相反。
升序排序,⽐Student类增加了Comparable接⼝,并实现升序排序:
public class StudentAsc implements Comparable<StudentAsc> {
private String name;
private Integer age;
public StudentAsc(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;
}
public int compareTo(StudentAsc o) {
if(null == this.age) {
return -1;
}
if(null == o.getAge()) {
return 1;
}
return this.Age());
}
@Override
public String toString() {
return "StudentAsc{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
⽅法调⽤:
//正序排序,年龄为null时为⼩
StudentAsc studentWang = new StudentAsc("王⼩⼆", 10);
StudentAsc studentZhang = new StudentAsc("张三", 1);
StudentAsc studentGou = new StudentAsc("狗⼦", 99);
StudentAsc studentZhao = new StudentAsc("赵六", 40);
StudentAsc studentLi = new StudentAsc("李四", null);
List<StudentAsc> studentAscs = new ArrayList<StudentAsc>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi)); Collections.sort(studentAscs);
System.out.println("⾃定义对象,升序排序:");
for(StudentAsc studentAsc : studentAscs) {
System.out.String());
}
返回:
⾃定义对象,升序排序:
Student{name='李四', age=null}
Student{name='张三', age=1}
Student{name='王⼩⼆', age=10}
Student{name='赵六', age=40}
Student{name='狗⼦', age=99}
降序排序,⽐Student类增加了Comparable接⼝,并实现倒序排序:
public class StudentDesc implements Comparable<StudentDesc> {
private String name;
private Integer age;
public StudentDesc(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;
}
public int compare(Integer o1, Integer o2) {
return o2pareTo(o1);
}
public int compareTo(StudentDesc o) {
if(null == this.age) {
return 1;
}
if(null == o.getAge()) {
return -1;
}
return o.Age());
}
@Override
public String toString() {
return "StudentDesc{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
⽅法调⽤:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。