目录
1. 整型(Integer)和字符串(String)类型的简单排序
这种列表数据的类型是List<Intger>
和List<String>
,是简单的数据类型。
可以使用以下的方法排序。
代码如下
package cn.qkongtao;/*
*Created by tao on 2020-05-25.
*/
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListSortDemo3 {
public static void main(String[] args) {
//对list升序排序
List<String> list = new ArrayList();
list.add("路飞");
list.add("索隆");
list.add("香吉士");
list.add("乔巴");
list.add("娜美");
System.out.println("========原始数据=======");
for (String s : list) {
System.out.println(s);
}
//升序
//是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法
Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
System.out.println("========升序排列=======");
for (String s : list) {
System.out.println(s);
}
//降序(要想实现根据的汉字的拼音的字母排序,应该先按上面升序,然后按下面降序)
Collections.reverse(list);
System.out.println("========降序排列=======");
for (String s : list) {
System.out.println(s);
}
}
}
排序结果如下
可以看出是按照中文首字母的全拼进行排序的
2. 根据list中的对象Bean中的某个属性进行排序
当List泛型的类型不是Integer和String,而是自定义的JavaBean时,这是属于一种复杂的结构,当我们要根据JavaBean中的某个字段进行排序时,可以使用以下的两种方法:
java8的新特性Lambda语法
代码如下
- Info.java(封装类)
package cn.qkongtao.domain;/*
*Created by tao on 2020-05-25.
*/
public class Info {
private String name;
private Integer age;
public Info() {
super();
}
public Info(String name, Integer age) {
super();
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;
}
@Override
public String toString() {
return "TestA [name=" + name + ", age=" + age + "]";
}
}
- ListSortDemo1.java测试类
package cn.qkongtao;/*
*Created by tao on 2020-05-25.
*/
import cn.qkongtao.domain.Info;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class ListSortDemo1 {
public static void main(String[] args) {
List<Info> users = new ArrayList<Info>();
Info user01 = new Info("张三", 18);
Info user02 = new Info("李四", 12);
Info user03 = new Info("王五", 26);
Info user04 = new Info("赵六", 50);
Info user05 = new Info("钱七", 37);
/*Info user01 = new Info("zhangsan", 3);
Info user02 = new Info("lisi", 1);
Info user03 = new Info("wangwu", 2);
Info user04 = new Info("zaoliu", 4);
Info user05 = new Info("qianqi", 0);
Info user06 = new Info("sunba", 9);*/
users.add(user01);
users.add(user02);
users.add(user03);
users.add(user04);
users.add(user05);
//java8遍历
users.forEach(p -> System.out.println(p.getAge()));
System.out.println("===排序前如下===");
users.stream().forEach(item -> System.out.println(item));
//根据年龄升序排序方式一
users.sort((a, b) -> a.getAge().compareTo(b.getAge()));
System.out.println("===根据年龄升序排序后如下方式一===");
users.stream().forEach(item -> System.out.println(item));
//根据年龄倒序排序方式一
users.sort((a, b) -> b.getAge().compareTo(a.getAge()));
System.out.println("===根据年龄降序排序后如下方式一===");
users.stream().forEach(item -> System.out.println(item));
//根据姓名升序排序(方式二简写)
users.sort(Comparator.comparing(Info::getName));
System.out.println("===根据姓名升序排序后如下方式二===");
users.stream().forEach(item -> System.out.println(item));
//根据姓名降序排序(方式二简写)
users.sort(Comparator.comparing(Info::getName).reversed());
System.out.println("===根据姓名降序排序后如下方式二===");
users.stream().forEach(item -> System.out.println(item));
//根据其中的某个对象的某个属性的值删除某个对象
/*System.out.print("删除前:");
users.stream().forEach(item -> System.out.print(item));
Iterator<Info> it = users.iterator();
while (it.hasNext()) {
Info s = it.next();
if (s.getName().equals("李四")) {
it.remove();
}
}
System.out.print("\n删除后:");
users.stream().forEach(item -> System.out.print(item));*/
}
}
测试结果如下
结果表明:如果按照整型的属性来进行排序,结果时可行的,但是按照字符串(汉字)的属性来进行排序,似乎没有按照首字的全拼来排序,而是有另外的排序规则(我也不清楚)。如果是非汉字的字符串,就会根据字母进行排序。
JavaBean实现Comparable接口
实现接口的方法是,将排序的Collator替换成中文工具类
Collator collator = Collator.getInstance(java.util.Locale.CHINA);
代码如下
- Info.java(实现接口的JavaBean)
package cn.qkongtao.domain;/*
*Created by tao on 2020-05-25.
*/
import java.text.Collator;
import java.util.Comparator;
public class Info implements Comparator<Info> {
private String name;
private Integer age;
public Info(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Info() {
}
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;
}
@Override
public String toString() {
return "TestA [name=" + name + ", age=" + age + "]";
}
Collator collator = Collator.getInstance(java.util.Locale.CHINA);
//重写compare方法
@Override
public int compare(Info o1, Info o2) {
return collator.compare(o1.getName(), o2.getName());
}
}
- ListSortDemo4,java(测试方法)
package cn.qkongtao;/*
*Created by tao on 2020-05-26.
*/
import cn.qkongtao.domain.Info;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListSortDemo4 {
public static void main(String[] args) {
List<Info> users = new ArrayList<Info>();
Info user01 = new Info("张三", 18);
Info user02 = new Info("李四", 12);
Info user03 = new Info("王五", 26);
Info user04 = new Info("赵六", 50);
Info user05 = new Info("钱七", 37);
Info user06 = new Info("乔巴", 37);
users.add(user01);
users.add(user02);
users.add(user03);
users.add(user04);
users.add(user05);
users.add(user06);
System.out.println("========原始数据=======");
for (Info user : users) {
System.out.println(user);
}
System.out.println("========升序=======");
Collections.sort(users, new Info());
for (Info user : users) {
System.out.println(user);
}
System.out.println("========降序=======");
Collections.reverse(users);
for (Info user : users) {
System.out.println(user);
}
}
}
测试结果
最后一种方法而可以实现JavaBean复杂类型的List按某个字段首字的中文全拼进行排序。