java 对象排序

1.  Comparator类,实现对象的对比字段

class Comparable implements Comparator<P>{
    // 对象的排序方式[升、降]   
    public static boolean sortASC = true;   
    // 对象的排序属性   
    public static boolean sortByName = false;   
    public static boolean sortById= false;
    
    @Override
    public int compare(P o1, P o2) {
        int result = 0 ;
        
        if(sortASC){
            if(sortById){
                result = o1.getId().compareTo(o2.getId());
            }else if(sortByName){
                result = o1.getName().compareTo(o2.getName());
            }
        }else{
            if(sortById){
                result = -o1.getId().compareTo(o2.getId());
            }else if(sortByName){
                result = -o1.getName().compareTo(o2.getName());
            }
        }
        return result;
    }
}

2.  main方法,简单的对属性排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestMain0630 {
	public static void main(String[] args) {
		P p1 = new P();
		p1.setId(1);
		p1.setName("张三");
		
		
		P p2 = new P();
		p2.setId(2);
		p2.setName("李四");

		P p3 = new P();
		p3.setId(3);
		p3.setName("王五");
		
		List<P> lp = new ArrayList<P>();
		lp.add(p2);
		lp.add(p1);
		lp.add(p3);
		
		for(P p : lp){
			System.out.println(p.getId()+"           "+p.getName());
		}
		
		Comparable ca = new Comparable();
		ca.sortASC=false;
		ca.sortById=true;
		
		System.out.println("==========================");
		
		Collections.sort(lp, ca);
		
	    for(P p : lp){
			System.out.println(p.getId()+"           "+p.getName());
		}
	}
}

class P{
	public P(){}
	int id;
	String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}



tips:上面的代码,是可以实现效果的,但是,代码的耦合度很高,不利于代码的修改和维护。

比如:如果我们增加了一个属性“生日”,我们希望按照“生日”来排序,那么,我们按照这样的逻辑,我们就必须得修改我们的Comparable代码,明显不符合“开闭原则”。

这里,如果使用“策略模式”,那就再好不过了!

首先,我们得为每个排序行为编写为单独的一个类

class ComparableByIdAsc implements Comparator<P>{

    @Override
    public int compare(P o1, P o2) {
        return o1.getId().compareTo(o2.getId());
    }
}
class ComparableByIdDesc implements Comparator<P>{
    
    @Override
    public int compare(P o1, P o2) {
        return -o1.getId().compareTo(o2.getId());
    }
}

然后,我们排序的调用入口

        System.out.println("按照id的正序排序");
        java.util.Comparator cp = new ComparableByIdAsc();
        Collections.sort(lp,cp);
        for(P p : lp){  
            System.out.println(p.getId()+"           "+p.getName());  
        }
        
        System.out.println("按照id的倒序排序");
        cp = new ComparableByIdAsc();
        Collections.sort(lp,cp);
        for(P p : lp){
            System.out.println(p.getId()+"           "+p.getName());  
        }

你可能感兴趣的:(java 对象排序)