java 排序 工具类_【BigData】Java基础_通用排序工具类的实现

简介

实现一个通用排序工具类,根据用户所选择的排序对象进行排序;例如通过年龄排序、通过工资排序、或者工资相等的情况下使用年龄排序

代码实现

代码结构图:

fa66cbc1f10d997aab461d777461a2fc.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.test.logan.day08;public interfaceCompare {public booleancompare(User u1,User u2);

}

Compare.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

以下三个分别是对年龄、工资、先工资后年龄排序的类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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中的代码,这样是极其不方便的,所以此处使用泛型优化,让该排序程序更加适应不同类

以下是代码:(此处所有代码都在同一个目录下)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.test.logan.day08;/*** 此处使用泛型,下面Compare中的对象类型M相当于一个变量

*@authorQIN

*

*@param*/

public interface Compare{public booleanCompare(M o1,M o2);

}

Compare.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

以下两个类是针对每个类需要排序字段而定制的

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

第二次优化:匿名类的使用

在第一次优化后的代码中我们不难发现,同一个类中,需要对不同字段排序的时候,我们每次都要写一个实现类,这样感觉文件很多,很麻烦,于是在此处使用了匿名类

66f4b540a0df8d9672683fece7a1b0b8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值