#2 Java进阶系列--集合的排序

一、需求
有时候,我们并不能直接对数据库进行操作,而是需要从文件中读取信息,这是就不能使用sql本身具有的排序功能,而是通过读取文件信息,通过List<T>来接收信息,并对List<T>进行排序、查询与删除。那么怎么对List<T>进行这些操作呢?且听我慢慢道来。

二、List<T>的排序操作
在集合框架中,Java提供了一个工具类Collections,该工具类能够对集合进行排序,我们先来看一个比较简单的例子:

System.out.println("整型元素排序:");
List<Integer> list = new ArrayList<Integer>();
for(int i = 0;i<5;i++){
    list.add(i);
}
list.add(2);
list.add(3);
System.out.println("list: ");

for(int i:list){
    System.out.print(i+" ");
}
System.out.println("\n对元素排序后的list2: ");
Collections.sort(list);
for(int i:list){
    System.out.print(i+" ");
}

System.out.println("\n字母元素排序:");
List<String> list3 = new ArrayList<String>();
list3.add("C");
list3.add("S");
list3.add("B");
System.out.println("list3: ");

for(String i:list3){
    System.out.print(i+" ");
}
System.out.println("\n对元素排序后的list4: ");
Collections.sort(list3);
for(String i:list3){
    System.out.print(i+" ");
}
/**output:
整型元素排序:
list: 
0 1 2 3 4 2 3 
对元素排序后的list2: 
0 1 2 2 3 3 4 
字母元素排序:
list3: 
C S B 
对元素排序后的list4: 
B C S 
*/

我们看到,在上面的例子中,Collections类提供的sort()方法进行排序操作,该方法既可以对数字类型的数据进行排序,也可以对字母进行一个排序。那么如果我们要对对象进行排序呢?
1、实体类

package com.yzh.maven.entity;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="userInfo")
public class UserInfo{
    private String userName;
    private String password;
    private int age;
    private String sex;
    private String tel;
    private String email;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public UserInfo(String userName, String password, int age, String sex,
            String tel, String email) {
        super();
        this.userName = userName;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.tel = tel;
        this.email = email;
    }
    public UserInfo() {
        super();
    }
    @Override
    public String toString() {
        return "UserInfo [userName=" + userName + ", password=" + password
                + ", age=" + age + ", sex=" + sex + ", tel=" + tel + ", email="
                + email + "]";
    }
}

2、构建排序方法

/**
    @functionname:sortList
    @description:通过用户名对list进行排序
    @author:yzh
    @param:list
    @date:2018-09-02
*/
public  List<UserInfo> sortList(List<UserInfo> list){
    Collections.sort(list,new Comparator<UserInfo>(){
        @Override
        public int compare(UserInfo u1, UserInfo u2) {
            //大于返回1
            //String类默认实现了java.lang.Comparable接口 compareTo()方法的返回值 s1.compareTo(s2)—》s1 与 s2 的ASC码 的差值,其实就是字典排序
            if(u1.getUserName().compareTo(u2.getUserName()) > 0){
                return 1;
            //等于返回0
            }else if(u1.getUserName().compareTo(u2.getUserName()) == 0){
                return 0;
            //小于返回-1
            }else{
                return -1;
            }
        }
    });
    return list;
}
说明:Collections的sort方法无法对实体类进行一个排序,实际上,我们可以重写sort方法,在Java中,开发者为我们提供了一个sort(List<T>list,Comparator接口)方法,为此我们需要实现Comparator接口的compare方法。

3、测试

public static void main(String[] args) {
    CollectionTest c = new CollectionTest();
    List<UserInfo> list1 = new ArrayList<UserInfo>();
    UserInfo user1 = new UserInfo();
    user1.setAge(23);
    user1.setEmail("123@qq.com");
    user1.setPassword("123456");
    user1.setSex("男");
    user1.setTel("12345678");
    user1.setUserName("LinDa");
    list1.add(user1);

    UserInfo user2 = new UserInfo();
    user2.setAge(23);
    user2.setEmail("1234@qq.com");
    user2.setPassword("123457");
    user2.setSex("女");
    user2.setTel("12345679");
    user2.setUserName("Jake");
    list1.add(user2);

    UserInfo user3 = new UserInfo();
    user3.setAge(24);
    user3.setEmail("1235@qq.com");
    user3.setPassword("123458");
    user3.setSex("男");
    user3.setTel("12345670");
    user3.setUserName("yzh");
    list1.add(user3);

    for(UserInfo u:list1){
        System.out.println(u);
    }

    c.sortList(list1);
    System.out.println("排序后:");
    for(UserInfo u:list1){
        System.out.println(u);
    }
}
/**output:
UserInfo [userName=LinDa, password=123456, age=23, sex=男, tel=12345678, email=123@qq.com]
UserInfo [userName=Jake, password=123457, age=23, sex=女, tel=12345679, email=1234@qq.com]
UserInfo [userName=yzh, password=123458, age=24, sex=男, tel=12345670, email=1235@qq.com]
排序后:
UserInfo [userName=Jake, password=123457, age=23, sex=女, tel=12345679, email=1234@qq.com]
UserInfo [userName=LinDa, password=123456, age=23, sex=男, tel=12345678, email=123@qq.com]
UserInfo [userName=yzh, password=123458, age=24, sex=男, tel=12345670, email=1235@qq.com]
**/

4、封装
上面的方法虽然能够满足对UserInfo的排序,但是却不能对其他实体类进行排序,这表明我们上面的方法拓展性方面比较差,那么如何设计出一个拓展性良好的方法呢?
(1)设计实体基础类

package com.yzh.maven.base.entity;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Entity<T> implements Comparable<T>{
    @Override
    public int compareTo(T t) {
        return 0;
    }
    public List<T> sortList(List<T> list){
        Collections.sort(list,new Comparator<T>(){
            @SuppressWarnings("unchecked")
            @Override
            public int compare(T t1,T t2) {
                return ((Comparable<T>) t1).compareTo(t2);
            }
        });
        return list;
    }
}
说明:这里为什么要设计一个compareTo()方法呢(实际上什么也没有实现)?首先需要知道的是,compareTo是Comparable接口的方法,该方法的作用是通过数字或者字母在ASC编码的位置来比较大小的,如果返回值大于1,那么就在顺序靠前,如果返回值等于1,说明是同一个对象,如果是小于0,那么顺序就会靠后;我在这里设计一个compareTo()方法,目的是让实体子类继承Entity类的compareTo()方法,然后重写它;重写后,这时,由于实体子类继承了Entity类的sortList方法,因此这时该方法就是用户自己指定实现的排序功能,而且这里使用了范型,可以同时适用于多个实体类。

(2)实体类
①UserInfo.java

package com.yzh.maven.entity;
import org.springframework.data.mongodb.core.mapping.Document;
import com.yzh.maven.base.entity.Entity;
@Document(collection="userInfo")
//让UserInfo继承`Entity<T>`
public class UserInfo extends `Entity<UserInfo>`{
    private String userName;
    private String password;
    private int age;
    private String sex;
    private String tel;
    private String email;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public UserInfo(String userName, String password, int age, String sex,
            String tel, String email) {
        super();
        this.userName = userName;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.tel = tel;
        this.email = email;
    }
    public UserInfo() {
        super();
    }
    //重写`Entity<T>`的compareTo()方法
    @Override
    public int compareTo(UserInfo u) {
        if(this == u){
            return 0;            
        }else{   
            if(userName.compareTo(u.getUserName()) > 0){
                return 1;
            }else if(userName.compareTo(u.getUserName()) == 0){
                return 0;
            }else{
                return -1;
            }
        }
    }

    @Override
    public String toString() {
        return "UserInfo [userName=" + userName + ", password=" + password
                + ", age=" + age + ", sex=" + sex + ", tel=" + tel + ", email="
                + email + "]";
    }
}

②Student.java

package com.yzh.maven.entity;
import com.yzh.maven.base.entity.Entity;
//让Student继承`Entity<T>`
public class Student extends `Entity<Student>`{
    private Integer stuId;
    private String name;
    private String password;
    private String sex;
    private int age;
    public Integer getStuId() {
        return stuId;
    }
    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [stuId=" + stuId + ", name=" + name + ", password="
                + password + ", sex=" + sex + ", age=" + age + "]";
    }
     //重写`Entity<T>`的compareTo()方法
    @Override
    public int compareTo(Student stu) {
        if(this == stu){
            return 0;            
        }else{   
            if(stuId.compareTo(stu.getStuId()) > 0){
                return 1;
            }else if(stuId.compareTo(stu.getStuId()) > 0){
                return 0;
            }else{
                return -1;
            }
        }
    }
}

(3)测试

List`<UserInfo>` list1 = new ArrayList<UserInfo>();
UserInfo user1 = new UserInfo();
user1.setAge(23);
user1.setEmail("123@qq.com");
user1.setPassword("123456");
user1.setSex("男");
user1.setTel("12345678");
user1.setUserName("LinDa");
list1.add(user1);

UserInfo user2 = new UserInfo();
user2.setAge(23);
user2.setEmail("1234@qq.com");
user2.setPassword("123457");
user2.setSex("女");
user2.setTel("12345679");
user2.setUserName("Jake");
list1.add(user2);

UserInfo user3 = new UserInfo();
user3.setAge(24);
user3.setEmail("1235@qq.com");
user3.setPassword("123458");
user3.setSex("男");
user3.setTel("12345670");
user3.setUserName("yzh");
list1.add(user3);

for(UserInfo u:list1){
    System.out.println(u);
}

user3.sortList(list1);
System.out.println("排序后:");
for(UserInfo u:list1){
    System.out.println(u);
}

System.out.println();
List<Student> list2 = new ArrayList<Student>();
Student stu1 = new Student();
stu1.setAge(23);
stu1.setName("A");
stu1.setPassword("123");
stu1.setSex("男");
stu1.setStuId(12);
list2.add(stu1);

Student stu2 = new Student();
stu2.setAge(21);
stu2.setName("B");
stu2.setPassword("124");
stu2.setSex("女");
stu2.setStuId(11);
list2.add(stu2);

Student stu3 = new Student();
stu3.setAge(24);
stu3.setName("C");
stu3.setPassword("125");
stu3.setSex("女");
stu3.setStuId(16);
list2.add(stu3);
for(Student stu:list2){
    System.out.println(stu);
}

stu1.sortList(list2);
System.out.println("排序后:");
for(Student stu:list2){
    System.out.println(stu);
}
/**output:
UserInfo [userName=LinDa, password=123456, age=23, sex=男, tel=12345678, email=123@qq.com]
UserInfo [userName=Jake, password=123457, age=23, sex=女, tel=12345679, email=1234@qq.com]
UserInfo [userName=yzh, password=123458, age=24, sex=男, tel=12345670, email=1235@qq.com]
排序后:
UserInfo [userName=Jake, password=123457, age=23, sex=女, tel=12345679, email=1234@qq.com]
UserInfo [userName=LinDa, password=123456, age=23, sex=男, tel=12345678, email=123@qq.com]
UserInfo [userName=yzh, password=123458, age=24, sex=男, tel=12345670, email=1235@qq.com]

Student [stuId=12, name=A, password=123, sex=男, age=23]
Student [stuId=11, name=B, password=124, sex=女, age=21]
Student [stuId=16, name=C, password=125, sex=女, age=24]
排序后:
Student [stuId=11, name=B, password=124, sex=女, age=21]
Student [stuId=12, name=A, password=123, sex=男, age=23]
Student [stuId=16, name=C, password=125, sex=女, age=24]
**/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值