这里仅转自javaeye的一篇文章;
排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。
再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。
如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。
于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。
代码如下
import java.util;
class Person
{
private String firstName;
private String lastName;
private boolean sex;
private Integer age;
public String getFirstName()
{
return firstName;
}
public void setFisrtName(String f)
{
this.firstName=f;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String l)
{
this.lastName=l;
}
public boolean getSex()
{
return sex;
}
public Integer getAge()
{
return age;
}
public Person(String f,String l,boolean b,int a)
{
this.firstName=f;
this.lastName=l;
this.sex=b;
this.age=a;
}
public String toString()
{
return this.getFirstName()+" "+this.getLastName()+" "+sex.booleanValue()?"男":"女"+" "+this.getAge();
}
}
class Comparators{
public static Comparator getComparator(){
return new Comparator(){
public int compare(Object obj1,Object obj2)
{
if(obj1 instanceof String)
{
return compare((String)obj1,(String)obj2);
}
else if(obj1 instanceof Integer)
{
return compare((Integer)obj1,(Integer)obj2);
}
else if(obj1 instanceof Person)
{
return compare((Person)obj1,(Person)obj2);
}
else
{
System.out.println("没有找到合适的比较器");
}
}
public int compare(String o1,String o2)
{
int len1=o1.length();
int len2=o2.length();
int len=Math.min(len1,len2);
char[] v1=o1.toArrayChar();
char[] v2=o2.toArrayChar();
int pos=0;
while(len--!=0)
{
char c1=v1[pos];
char c2=v2[pos];
if(c1!=c2)
{
return c1-c2;
}
pos++;
}
return len1-len2;
}
public int compare(Integer o1,Integer o2)
{
int i1=o1.intValue();
int i2=o2.intValue();
return i1<i2?-1:(i1==i2?0:1);
}
public int compare(Person o1,Person o2)
{
String firstname1=o1.getFirstName();
String firstname2=o2.getFirstName();
String lastname1=o1.getLastName();
String lastname2=o2.getLastName();
boolean sex1=o1.getSex();
boolean sex2=o2.getSex();
Ingeter age1=o1.getAge();
Ingeter age2=o2.getAge();
return compare(firstname1,firstname2)==0?(compare(lastname1,lastname2)==0?(compare(sex1,sex2)==0?compare(age1,age2):compare(sex1,sex2)):compare(lastname1,lastname2)):comapre(firstname1,firstname2);
}
};
}
}
public class Main
{
public static void main(String[] args)
{
Person[] person = new Person[] {
new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
new Person("zhuang", "gw", Boolean.FALSE, new Integer(2))
};
for (int i = 0; i < person.length; i++) {
System.out.println("before sort=" + person[i]);
}
java.util.Arrays.sort(person, Comparators.getComparator());
for (int i = 0; i < person.length; i++) {
System.out.println("after sort=" + person[i]);
}
}
}