自己的通用排序工具
USer类
package day08.Util1;
public class User {
private String name;
private int age;
private double salary;
public User() {
}
public User( String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return name + "," + age + ","+ salary ;
}
}
排序工具类—利用接口封装排序框架
package day08.Util1;
import java.util.ArrayList;
public class SortUtil {
public static void sort(ArrayList<User> uList,BiJiaoQi bijiaoqi) {
for(int i=0;i<uList.size()-1;i++) {
for(int j=0;j<uList.size()-1-i;j++) {
boolean bijiao =bijiaoqi.bijiao(uList.get(j), uList.get(j+1));
if(bijiao) {
User uu =uList.get(j);
uList.set(j, uList.get(j+1));
uList.set(j+1, uu);
}
}
}
}
}
接口,用户在使用框架的时候,必须传入这个接口的一个实现类对象
package day08.Util1;
public interface BiJiaoQi {
public boolean bijiao(User u1,User u2);
}
实现接口功能—比较
package day08.Util1;
public class AgeBiJiaoQi implements BiJiaoQi {
@Override
public boolean bijiao(User u1, User u2) {
if (u1.getAge() < u2.getAge()) {
return true;
}
return false;
}
}
测试类
package day08.Util1;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<User> arrayList = new ArrayList<>();
User user1 = new User("aa", 12, 100);
User user2 = new User("bb", 13, 200);
User user3 = new User("cc", 14, 300);
arrayList.add(user1);
arrayList.add(user2);
arrayList.add(user3);
//使用工具
SortUtil.sort(arrayList, new AgeBiJiaoQi());
for(User u:arrayList) {
System.out.println(u);
}
}
}
泛型参数排序工具
User类
package day08.Util2;
public class User {
private String name;
private int age;
private float salary;
public User() {
}
public User(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return this.name + "," + this.age + "," + this.salary;
}
}
Product类
package day08.Util2;
public class Product {
private String productId;
private String productName;
private double price;
private int sum;
public Product() {}
public Product(String productId, String productName, double price, int sum) {
this.productId = productId;
this.productName = productName;
this.price = price;
this.sum = sum;
}
public String getproductId() {
return productId;
}
public void setproductId(String productId) {
this.productId = productId;
}
public String getproductName() {
return productName;
}
public void setproductName(String productName) {
this.productName = productName;
}
public double getprice() {
return price;
}
public void setprice(double price) {
this.price = price;
}
public int getsum() {
return sum;
}
public void setsum(int sum) {
this.sum = sum;
}
@Override
public String toString() {
return "Product [productId=" + productId + ", productName=" + productName + ", price=" + price + ", sum=" + sum
+ "]";
}
}
排序工具
package day08.Util2;
import java.util.ArrayList;
/**
* SortUtil<T>里面的T是声明了一个代表“类型”的参数符号
* 然后在SortUtil类中,就可以用T这个符号来代替具体的类型名
*
* 这就是泛型
* @author ThinkPad
*
* @param <T>
*/
public class SortUtil<T> {
public void sort(ArrayList<T> list, BijiaoQi<T> bijiaoqi) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = 0; j < list.size() - 1 - i; j++) {
boolean da = bijiaoqi.bijiao(list.get(j), list.get(j + 1));
if (da) {
T tmp = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, tmp);
}
}
}
}
}
接口
package day08.Util2;
public interface BijiaoQi<Y> {
public boolean bijiao(Y o1 ,Y o2);
}
实现接口–按年龄排序对User排序
package day08.Util2;
public class AgeBijiaoqi implements BijiaoQi<User>{
public boolean bijiao(User o1, User o2) {
if(o1.getAge() > o2.getAge()) {
return true;
}
return false;
}
}
实现接口–按价格对Product排序
package day08.Util2;
public class PriceBijiaoqi implements BijiaoQi<Product> {
@Override
public boolean bijiao(Product o1, Product o2) {
if (o1.getprice() > o2.getprice()) {
return true;
}
return false;
}
}
测试类----并且使用了 ‘匿名内部类’ 不需要创先新的类来实例化接接口、测试了Collections
package day08.Util2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
// 造数据
ArrayList<User> uList = new ArrayList<>();
User u1 = new User("a", 18, 2000);
User u2 = new User("b", 19, 3000);
User u3 = new User("c", 28, 1800);
User u4 = new User("d", 20, 2300);
uList.add(u1);
uList.add(u2);
uList.add(u3);
uList.add(u4);
// 构造一个排序工具
SortUtil<User> sortUtil = new SortUtil<>();
sortUtil.sort(uList, new AgeBijiaoqi());
// 对product list排序
ArrayList<Product> plist = new ArrayList<>();
plist.add(new Product("1", "a", 15.0, 3));
plist.add(new Product("2", "b", 25.0, 2));
plist.add(new Product("3", "c", 35.0, 4));
plist.add(new Product("4", "d", 45.0, 5));
SortUtil<Product> sortUtil2 = new SortUtil<>();
// 按价格比较
sortUtil2.sort(plist, new PriceBijiaoqi());
//按照数量比较,用匿名内部类,不需要再创建新的类
sortUtil2.sort(plist, new BijiaoQi<Product>() {
@Override
public boolean bijiao(Product o1, Product o2) {
if (o1.getsum() > o2.getsum()) {
return true;
}
return false;
}
});
//对list排序jdk有现成的工具Collections
Collections.sort(plist, new Comparator<Product>(){
/*返回正o1>o2
* 返回负数o2<o1
* 返回0 o2=o1
*/
public int compare(Product o1,Product o2) {
double res = o1.getprice()-o2.getprice();
if(res>0) { //> < 控制升降序
return 1;
}
return -1;
}
});
for(Product p : plist) {
System.out.println(p);
}
}
}
JDK中Collections排序工具
User类
package day08.Util3;
public class User implements Comparable<User> {
private String name;
private int age;
private float salary;
public User() {
}
public User(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return this.name + "," + this.age + "," + this.salary;
}
@Override
public int compareTo(User other) {
if (this.getSalary() > other.getSalary()) {
return 1;
}
return -1;
}
}
Test类
package day08.Util3;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CollectionsTest {
public static void main(String[] args) {
ArrayList<User> uList = new ArrayList<>();
User u1 = new User("a", 18, 2000);
User u2 = new User("b", 19, 3000);
User u3 = new User("c", 28, 1800);
User u4 = new User("d", 20, 2000);
uList.add(u1);
uList.add(u2);
uList.add(u3);
uList.add(u4);
// Collections工具来排序
// 方式1:传专门的比较器给工具,此方法最通用,想按什么比就按什么比
Collections.sort(uList, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
if (o1.getAge() < o2.getAge()) { //< > 控制升降序
return 1;
}
return -1;
}
});
for(User u:uList) {
System.out.println(u);
}
System.out.println("-----------------------");
//方式2:不传专门的比较工具,前提是,list中的数据类型可比较
//(数据类型本身要实现一个接口Comparable)实现其中的compareTo()方法
Collections.sort(uList);
for(User uu: uList) {
System.out.println(uu);
}
}
}