一、需求
有时候,我们并不能直接对数据库进行操作,而是需要从文件中读取信息,这是就不能使用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]
**/