Collections.sort()的详细讲解
很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提供了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。
怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口啦。然后重写里面的
compareTo()方法。我们可以看到Java中很多类都是实现类这个接口的 如:Integer,Long 等
假设我们有一个学生类,默认需要按学生的年龄字段 age 进行排序 代码如下:
package bag;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Student implements Comparable<Student>{
int id;
int age;
String name;
public Student(int id,int age,String name) {
// TODO 自动生成的构造函数存根
this.id = id;
this.age = age;
this.name = name;
}
//以下方法三个均是为了该类的封装性
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
//便于返回每个对象的信息
public String toString() {
return "Student{"+"id="+id+", age="+age+", name= "+name+"}";
}
//重点:重写该方法定义排序方式 @Override
public int compareTo(Student o) {
// TODO 自动生成的方法存根
//return this.age - o.age;//按升序排列
return o.age - this.age;//按降序排列
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
ArrayList<Student> s = new ArrayList<Student>();
Student s1 = new Student(1,24,"1");
Student s2 =new Student(4,23,"2");
Student s3 =new Student(2,22,"3");
Student s4 = new Student(3,25,"4");
Student s5 = new Student(5,24,"5");
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
System.out.println("排序前");
for (Student student : s) {
System.out.println(student.toString());
}
Collections.sort(s);
//第一种方法根据age来排序
System.out.println("默认排序");
for (Student student : s) {
System.out.println(student.toString());
}
//第二种方法根据id来排序
/*Collections.sort(s, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // TODO 自动生成的方法存根 //以下两种方法均可,但第二种破坏了封装性,故不采用 return s1.getId() - s2.getId(); //return s1.id-s2.id; } });*/
//第三种方法根据id来排序
s.sort(new Comparator<Student>() {
//使用匿名类
//这样实现接口不用再专门写一格实现类了。
public int compare(Student s1, Student s2) {
// TODO 自动生成的方法存根
//return s1.getId() - s2.getId();//升序
return s2.getId() - s1.getId();//降序
}
});
System.out.println("排序后");
for (Student student : s) {
System.out.println(student.toString());
}
}
}
这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值: 负整数,零 ,正整数
返回值的含义
负整数 : 当前对象的值 < 比较对象的值 , 位置排在前
零 :当前对象的值 = 比较对象的值 , 位置不变
正整数 : 当前对象的值 > 比较对象的值 , 位置排在后
比较器的使用 Comparator
默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了。
Comparator 的使用有两种方式:
Collections.sort(list,Comparator);
list.sort(Comparator);
这两种方法中的Student不需要继承接口Comparable。
除了用匿名类实现外,还可以用内部类实现。如下
package bag;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Human {
private String name;
private int age;
public Human() {
}
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
//该方法方便初始化之后可以更改相关值
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//这种初始的方法可以留意一下
public static List<Human> getAInitHumanList() {
return new ArrayList<Human>() {
{
add(new Human("guorao", 10));
add(new Human("mako", 12));
add(new Human("hel", 30));
add(new Human("lin", 28));
}
};
}
@Override
public String toString() {
return this.getName() + ":" + this.getAge();
}
public class HumanComparetor implements Comparator<Human> {
//内部类
@Override
public int compare(Human h1, Human h2) {
if (h1.getAge() > h2.getAge()) {
return 1;
} else if (h1.getAge() == h2.getAge()) {
return 0;
} else {
return -1;
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Human> humans = Human.getAInitHumanList();
+ Collections.sort(humans, new HumanComparetor());
/* 如果使用+处的代码,则会出现以下编译提示 *没有任何类型 Human 的外层实例可访问。 *必须用类型 Human 的外层实例(例如,x.new A(), *其中 x 是 Human 的实例)来限定分配。 *所以应替换成如下+处的代码这是内部类调用的规则 *先创建一个外部类实例,再通过该实例实例化内部类 *Human human1 = new Human(); * HumanComparetor h = human1.new HumanComparetor();即可调用内部类的方法与实例变量*/
+Human human1 = new Human();
+Collections.sort(humans, human1.new HumanComparetor());
for (Human human : humans) {
System.out.println(human.toString());
}
}
}
方法的局部使用局部类
package bag;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.omg.CORBA.PUBLIC_MEMBER;
public class Human {
private String name;
private int age;
public Human() {
}
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
//该方法方便初始化之后可以更改相关值
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//这种初始的方法可以留意一下
public static List<Human> getAInitHumanList() {
return new ArrayList<Human>() {
{
add(new Human("guorao", 10));
add(new Human("mako", 12));
add(new Human("hel", 30));
add(new Human("lin", 28));
}
};
}
@Override
public String toString() {
return this.getName() + ":" + this.getAge();
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Human> humans = Human.getAInitHumanList();
class HumanComparetor implements Comparator<Human> {
//内部类,该类前的限制符不可为public,只能为抽象与终极态
@Override
public int compare(Human h1, Human h2) {
/*if (h1.getAge() > h2.getAge()) { return 1; } else if (h1.getAge() == h2.getAge()) { return 0; } else { return -1; }*/
//两种均可均是升序
return h1.getAge() - h2.getAge();
}
}
Collections.sort(humans, new HumanComparetor());
for (Human human : humans) {
System.out.println(human.toString());
}
}
}
今天的文章Collections.sort()的详细讲解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12640.html