package org.quickbundle.util;
import java.util.Set;
import java.util.TreeSet;
/**
* 实现一个多编码的排序
* @author Administrator
*/
public class RmOrderCodes implements Comparable<RmOrderCodes> {
private Object[] codes;
/**
* @param codes_
*/
public RmOrderCodes(Object... codes_) {
this.codes = codes_;
}
public Object[] getCodes() {
return codes;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(int i=0; i<codes.length; i++) {
if(i > 0) {
sb.append("|");
}
sb.append(codes[i]);
}
return sb.toString();
}
public int compareTo(RmOrderCodes obj2) {
if(codes.length == 0) {
if(obj2.codes.length == 0) {
return 0;
} else {
return -1;
}
}
for(int i=0; i<codes.length-1; i++) {
Object code1 = codes[i];
if(obj2.codes.length < i+1) {
return 1;
} else {
Object code2 = obj2.codes[i];
if(code1 == null) {
if(code2 != null) {
return -1;
}
} else {
if(code2 == null) {
return 1;
} else if(!code1.equals(code2)) {
return compareObj(code1, code2);
}
}
}
}
Object lastCode1 = codes[codes.length-1];
if(obj2.codes.length < codes.length) {
return 1;
} else {
Object lastCode2 = obj2.codes[codes.length-1];
if(lastCode1 == null) {
if(lastCode2 != null) {
return -1;
} else {
return 0;
}
} else {
if(lastCode2 == null) {
return 1;
} else {
return compareObj(lastCode1, lastCode2);
}
}
}
}
@SuppressWarnings("unchecked")
private int compareObj(Object obj1, Object obj2) {
if(obj1 instanceof Comparable && obj2 instanceof Comparable) {
return ((Comparable<Object>)obj1).compareTo(obj2);
} else {
throw new RuntimeException("对象不能比较");
}
}
public final static void main(String[] args) {
Set<RmOrderCodes> s = new TreeSet<RmOrderCodes>();
s.add(new RmOrderCodes(new Object[]{"a", "2"}));
s.add(new RmOrderCodes(new Object[]{"", "2"}));
s.add(new RmOrderCodes(new Object[]{null, "bbn"}));
s.add(new RmOrderCodes(new Object[]{"booo", null}));
s.add(new RmOrderCodes(new Object[]{"zzz", null}));
s.add(new RmOrderCodes(new Object[]{"booo", "ddd"}));
s.add(new RmOrderCodes("fdsafdsa", "a", "bbbbbbbb"));
s.add(new RmOrderCodes("fdsafdsa", "a", "bbbbbbbb"));
System.out.println(s);
}
}