java排序comparable 与 comparator实例
自定义(复杂)类型,如果遇到按照不同的规则进行排序,可以参照以下的方法。
?
参考资料:http://z-jianwen.iteye.com/blog/616316
?
?
在此,举一例:
?
package com;public class Goods {// 定义全参构造器public Goods(int _num,int _weigth,int _value){this.setNum(_num);this.setValue(_value);this.setWeigth(_weigth);}// 定义方法,获得单位价值public int getPervalue(){int perValue = this.value/this.weigth;return perValue;}@Overridepublic String toString() {return "Goods[" + this.getNum() + "] : weight = " + this.getWeigth() + " value = " + this.getValue();}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public int getWeigth() {return weigth;}public void setWeigth(int weigth) {this.weigth = weigth;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}// 属性private int num;private int weigth;private int value;}?
?
package comparator;import java.util.Comparator;import com.Goods;public class PerValueComparator implements Comparator<Goods> {@Overridepublic int compare(Goods o1, Goods o2) {// 单位价值大的排前面if (o1.getPervalue() != o2.getPervalue()) {return o2.getPervalue() - o1.getPervalue();}else {// 如果两者的单位价值相等,则重量小的排前面return o1.getWeigth() - o2.getWeigth();}}}?
?
package comparator;import java.util.Comparator;import com.Goods;public class ValueComparator implements Comparator<Goods> {@Overridepublic int compare(Goods o1, Goods o2) {// 价值大的排前面if (o1.getValue() != o2.getValue()) {return o2.getValue() - o1.getValue();}else {// 如果两者的价值相等,则重量小的排前面return o1.getWeigth() - o2.getWeigth();}}}?
?
package comparator;import java.util.Comparator;import com.Goods;public class WeightComparator implements Comparator<Goods> {@Overridepublic int compare(Goods o1, Goods o2) {// 重量小的排前面if (o1.getWeigth() != o2.getWeigth()) {return o1.getWeigth() - o2.getWeigth();}else {// 如果两者的重量相等,则价值大的排前面return o2.getValue() - o1.getValue();}}}?
?
package test;import java.util.ArrayList;import java.util.Collections;import com.Goods;import comparator.PerValueComparator;import comparator.ValueComparator;import comparator.WeightComparator;public class TestCompare {public static void main(String[] args) {ArrayList<Goods> list = new ArrayList<Goods>();list.add(new Goods(1,20,30));list.add(new Goods(2,8,10));list.add(new Goods(3,10,15));list.add(new Goods(4,30,35));list.add(new Goods(5,5,8));list.add(new Goods(6,30,45));list.add(new Goods(7,18,10));list.add(new Goods(8,4,5));System.out.println("---------- before sort ----------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}// 根据重量从小到大排列Collections.sort(list, new WeightComparator());System.out.println("---------- 根据重量从小到大排列 ----------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}// 根据价值从大到小排列Collections.sort(list, new ValueComparator());System.out.println("---------- 根据价值从大到小排列 ----------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}// 根据单位价值从大到小排列Collections.sort(list, new PerValueComparator());System.out.println("---------- 根据单位价值从大到小排列 ----------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}}?
?
---------- before sort ----------Goods[1] : weight = 20 value = 30Goods[2] : weight = 8 value = 10Goods[3] : weight = 10 value = 15Goods[4] : weight = 30 value = 35Goods[5] : weight = 5 value = 8Goods[6] : weight = 30 value = 45Goods[7] : weight = 18 value = 10Goods[8] : weight = 4 value = 5---------- 根据重量从小到大排列 ----------Goods[8] : weight = 4 value = 5Goods[5] : weight = 5 value = 8Goods[2] : weight = 8 value = 10Goods[3] : weight = 10 value = 15Goods[7] : weight = 18 value = 10Goods[1] : weight = 20 value = 30Goods[6] : weight = 30 value = 45Goods[4] : weight = 30 value = 35---------- 根据价值从大到小排列 ----------Goods[6] : weight = 30 value = 45Goods[4] : weight = 30 value = 35Goods[1] : weight = 20 value = 30Goods[3] : weight = 10 value = 15Goods[2] : weight = 8 value = 10Goods[7] : weight = 18 value = 10Goods[5] : weight = 5 value = 8Goods[8] : weight = 4 value = 5---------- 根据单位价值从大到小排列 ----------Goods[8] : weight = 4 value = 5Goods[5] : weight = 5 value = 8Goods[2] : weight = 8 value = 10Goods[3] : weight = 10 value = 15Goods[1] : weight = 20 value = 30Goods[6] : weight = 30 value = 45Goods[4] : weight = 30 value = 35Goods[7] : weight = 18 value = 10
?
?