最近遇到了个问题, 一时想不出好的解决办法. 看看大家有什么好的办法没.
问题是这样的:
有一类Obj, 它有四个属性aa, bb, cc, dd, 我现在要分别按这四个属性进行排名并取得名次. 现有两个笨方法
1)用Collections.sort
2)用TreeSet
简单测试了一下, 随机生成1000个数据, 两个算法的时间差不多, 大概都是220 ~ 260之间. 不太懂什么复杂度的东西, 请大家帮忙分析一下哪个方法更好, 如果有更好的方法, 请不吝赐教 :)
测试程序:package test;import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;public class Test { /**
 * @param args
 */
public static void main(String[] args) {
List<Obj> list = new ArrayList<Obj>();
for(int i = 0; i<1000; i++){
list.add(new Obj("o"+i));
}

long start = System.currentTimeMillis();

Collections.sort(list, Test.getComp(1));
Obj o = null;

int i = 0;
for (Iterator<Obj> it = list.iterator(); it.hasNext();) {
it.next().setA(++i);
}
i = 0;
Collections.sort(list, Test.getComp(2));
for (Iterator<Obj> it = list.iterator(); it.hasNext();) {
it.next().setB(++i);
}
i = 0;
Collections.sort(list, Test.getComp(3));
for (Iterator<Obj> it = list.iterator(); it.hasNext();) {
it.next().setC(++i);
}
i = 0;
Collections.sort(list, Test.getComp(4));
for (Iterator<Obj> it = list.iterator(); it.hasNext();) {
it.next().setD(++i);
}
for (Iterator<Obj> it = list.iterator(); it.hasNext();) {
System.out.println(it.next());
}

/*
                //TreeSet方法
TreeSet<Obj> ts1 = new TreeSet<Obj>(Test.getComp(1));
TreeSet<Obj> ts2 = new TreeSet<Obj>(Test.getComp(2));
TreeSet<Obj> ts3 = new TreeSet<Obj>(Test.getComp(3));
TreeSet<Obj> ts4 = new TreeSet<Obj>(Test.getComp(4));

Obj o = null;
for(Iterator<Obj> it = list.iterator(); it.hasNext();) {
o = it.next();
ts1.add(o);
ts2.add(o);
ts3.add(o);
ts4.add(o);
}

int i = 0;
for(Iterator<Obj> it = ts1.iterator(); it.hasNext();){
it.next().setA(++i);
}
i = 0;
for(Iterator<Obj> it = ts2.iterator(); it.hasNext();){
it.next().setB(++i);
}
i = 0;
for(Iterator<Obj> it = ts3.iterator(); it.hasNext();){
it.next().setC(++i);
}
i = 0;
for(Iterator<Obj> it = ts4.iterator(); it.hasNext();){
it.next().setD(++i);
}

for(Iterator<Obj> it = ts1.iterator(); it.hasNext();){
System.out.println(it.next());
}*/

long end = System.currentTimeMillis();
System.out.println("time passed:"+(end-start));
} private static Comparator<Obj> getComp(final int type) {
Comparator<Obj> comp = new Comparator<Obj>() {
public int compare(Obj o1, Obj o2) {
switch (type) {
case 1:
return (o1.getAa() - o2.getAa()) > 0 ? 1 : -1; // 不设置相等的情况, 以免被treeset去掉
case 2:
return (o1.getBb() - o2.getBb()) > 0 ? 1 : -1;
case 3:
return (o1.getCc() - o2.getCc()) > 0 ? 1 : -1;
case 4:
return (o1.getDd() - o2.getDd()) > 0 ? 1 : -1;
default:
return (o1.getAa() - o2.getAa()) > 0 ? 1 : -1;
}
}
};
return comp;
}
}class Obj {
private String name; private int a;
private int b;
private int c;
private int d; private double aa;
private double bb;
private double cc;
private double dd; public Obj(String name) {
this.name = name; this.aa = Math.random();
this.bb = Math.random();
this.cc = Math.random();
this.dd = Math.random();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getA() {
return a;
} public void setA(int a) {
this.a = a;
} public int getB() {
return b;
} public void setB(int b) {
this.b = b;
} public int getC() {
return c;
} public void setC(int c) {
this.c = c;
} public int getD() {
return d;
} public void setD(int d) {
this.d = d;
} public double getAa() {
return aa;
} public void setAa(double aa) {
this.aa = aa;
} public double getBb() {
return bb;
} public void setBb(double bb) {
this.bb = bb;
} public double getCc() {
return cc;
} public void setCc(double cc) {
this.cc = cc;
} public double getDd() {
return dd;
} public void setDd(double dd) {
this.dd = dd;
} public String toString() {
StringBuffer sb = new StringBuffer();
NumberFormat nf = NumberFormat.getInstance(); sb.append(this.name).append(":<").append(a).append(",").append(b)
.append(",").append(c).append(",").append(d).append(">");
sb.append(" - ");
sb.append("<").append(nf.format(aa)).append(",").append(nf.format(bb))
.append(",").append(nf.format(cc)).append(",").append(
nf.format(dd)).append(">");
return sb.toString();
}
}