简介
实现一个通用排序工具类,根据用户所选择的排序对象进行排序;例如通过年龄排序、通过工资排序、或者工资相等的情况下使用年龄排序
代码实现
代码结构图:
packagecn.test.logan.day08;importjava.util.ArrayList;public classSortUtilTest {public static voidmain(String[] args) {
User u1= new User("001","张三",30,1000);
User u2= new User("002","李四",29,1200);
User u3= new User("003","王五",27,1000);
User u4= new User("004","狗蛋",24,1400);
ArrayList list = new ArrayList<>();
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);//根据年龄排序//SortUtil.sort(list, new AgeCompare());//根据工资排序//SortUtil.sort(list, new SalaryCompare());//先根据工资,工资相等则根据年龄
SortUtil.sort(list, newSalaryAgeCompare());for(User u:list) {
System.out.println(u);
}
}
}
SortUtilTest.java
packagecn.test.logan.day08;importjava.util.ArrayList;public classSortUtil {public void sort(ArrayListuList,Compare com) {for(int i=0;i
boolean res = com.compare(uList.get(j), uList.get(j+1));if(res) {
User tmp=uList.get(j);
uList.set(j,uList.get(j+1));
uList.set(j+1, tmp);
}
}
}
}
}
SortUtil.java
packagecn.test.logan.day08;public interfaceCompare {public booleancompare(User u1,User u2);
}
Compare.java
packagecn.test.logan.day08;/*** 定义一个User类
* 包含:ID,姓名,年龄,薪水
*@authorQIN
**/
public classUser {privateString id;privateString name;private intage;private floatsalary;publicUser() {
}public User(String id, String name, int age, floatsalary) {this.id =id;this.name =name;this.age =age;this.salary =salary;
}publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}public floatgetSalary() {returnsalary;
}public void setSalary(floatsalary) {this.salary =salary;
}//定义toString方法
@OverridepublicString toString() {return this.id + "," + this.name + "," + this.age + "," + this.salary;
}
}
User.java
以下三个分别是对年龄、工资、先工资后年龄排序的类
packagecn.test.logan.day08;public class AgeCompare implementsCompare{
@Overridepublic booleancompare(User u1, User u2) {if(u1.getAge() >u2.getAge()) {return true;
}return false;
}
}
AgeCompare .java
packagecn.test.logan.day08;public class SalaryCompare implementsCompare{
@Overridepublic booleancompare(User u1, User u2) {if(u1.getSalary() >u2.getSalary()) {return true;
}return false;
}
}
SalaryCompare.java
packagecn.test.logan.day08;public class SalaryAgeCompare implementsCompare{
@Overridepublic booleancompare(User u1, User u2) {//先根据工资排序,如果工资相同再根据年龄排序
if(u1.getSalary() >u2.getSalary()) {return true;
}if(u1.getSalary() ==u2.getSalary()) {if(u1.getAge() >u2.getAge() ) {return true;
}
}return false;
}
}
SalaryAgeCompare.java
第一次优化:使用泛型
在上面的代码中,很容易发现,如果我需要对一个商品类排序,那么就得修改SortUtil.java中的代码,这样是极其不方便的,所以此处使用泛型优化,让该排序程序更加适应不同类
以下是代码:(此处所有代码都在同一个目录下)
packagecn.test.logan.day08;importjava.util.ArrayList;public classSortUtilTest {public static voidmain(String[] args) {
User u1= new User("001","张三",30,1000);
User u2= new User("002","李四",29,1200);
User u3= new User("003","王五",27,1000);
User u4= new User("004","狗蛋",24,1400);//快捷键ctrl + alt + 向下箭头可以复制上一行
ArrayList ulist = new ArrayList<>();
ulist.add(u1);
ulist.add(u2);
ulist.add(u3);
ulist.add(u4);//构造排序工具
SortUtil sortutil = new SortUtil<>();//根据用户类排序
sortutil.sort(ulist, newAgeCompare());//打印排序后结果
for(User u:ulist){
System.out.println(u);
}
System.out.println("---------------------------");
Product pd1= new Product("p001","苹果",10f,5);
Product pd2= new Product("p002","橘子",3f,2);
Product pd3= new Product("p003","西瓜",9f,1);
Product pd4= new Product("p004","火龙果",15f,8);
ArrayList plist = new ArrayList<>();
plist.add(pd1);
plist.add(pd2);
plist.add(pd3);
plist.add(pd4);//构造排序工具
SortUtil psort = new SortUtil<>();
psort.sort(plist,newPriceCompare());//打印排序后结果
for(Product p:plist){
System.out.println(p);
}
}
}
SortUtilTest.java
packagecn.test.logan.day08;/** SortUtil里面的T是声明了一个代表“类型”的参数符号
* 然后在SortUtil类中,就可以用T这个符号来代替具体的类型名,这就是所谓的泛型
*
**/
importjava.util.ArrayList;public class SortUtil{public void sort(ArrayList uList,Comparecom){for(int i=0;i
T tmp=uList.get(j);
uList.set(j, uList.get(j+1));
uList.set(j+1, tmp);
}
}
}
}
}
SortUtil.java
packagecn.test.logan.day08;/*** 此处使用泛型,下面Compare中的对象类型M相当于一个变量
*@authorQIN
*
*@param*/
public interface Compare{public booleanCompare(M o1,M o2);
}
Compare.java
packagecn.test.logan.day08;public classUser {
String id;
String name;intage;floatsalary;//生成空参构造函数//生成步骤:右键—>source—>Generate Constructors from Superclass
publicUser() {super();
}//生成有参构造函数//生成步骤:右键—>source—>Generate Constructors using Fields
public User(String id, String name, int age, floatsalary) {super();this.id =id;this.name =name;this.age =age;this.salary =salary;
}//get与set方法//右键->source->Generate Getters and Setters
publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}public floatgetSalary() {returnsalary;
}public void setSalary(floatsalary) {this.salary =salary;
}//toString方法重写
@OverridepublicString toString() {return this.id +","+ this.name +","+ this.age +","+ this.salary;
}
}
User.java
packagecn.test.logan.day08;/*** 商品类:商品ID、商品名称、商品价格、商品数量
*@authorQIN
**/
public classProduct {
String pId;
String pName;floatprice;intnum;//空参构造函数
publicProduct(){
}//有参构造函数
public Product(String pId, String pName, float price, intnum) {super();this.pId =pId;this.pName =pName;this.price =price;this.num =num;
}//get与set方法
publicString getpId() {returnpId;
}public voidsetpId(String pId) {this.pId =pId;
}publicString getpName() {returnpName;
}public voidsetpName(String pName) {this.pName =pName;
}public floatgetPrice() {returnprice;
}public void setPrice(floatprice) {this.price =price;
}public intgetNum() {returnnum;
}public void setNum(intnum) {this.num =num;
}//toString方法
@OverridepublicString toString() {return "Product [pId=" + pId + ", pName=" + pName + ", price=" + price + ", num=" + num + "]";
}
}
Product.java
以下两个类是针对每个类需要排序字段而定制的
packagecn.test.logan.day08;public class AgeCompare implements Compare{
@Overridepublic booleanCompare(User o1, User o2) {if(o1.getAge() >o2.getAge()){return true;
}return false;
}
}
AgeCompare.java
packagecn.test.logan.day08;public class PriceCompare implements Compare{
@Overridepublic booleanCompare(Product o1, Product o2) {if(o1.getPrice() >o2.getPrice()){return true;
}return false;
}
}
PriceCompare.java
第二次优化:匿名类的使用
在第一次优化后的代码中我们不难发现,同一个类中,需要对不同字段排序的时候,我们每次都要写一个实现类,这样感觉文件很多,很麻烦,于是在此处使用了匿名类