經過一個下午對java泛型數組的學習,通過排序程序進行總結,歡迎java大牛們批改和補充。
·java根據數組的
自然順序對基本數據類型和String類型的泛型數組(數組也可以,不過這里只介紹泛型數組)有很好的排序功能,如下添加4條字符串,然后通過對泛型數組列表進行相應的操作,分別按照升序和降序輸出:
import java.util.ArrayList;
import java.util.Collections;


public class Sort
{

public static void main(String args[])
{
ArrayList<String> array = new ArrayList<String>();
array.add("ccccc");
array.add("bbbbb");
array.add("ddddd");
array.add("aaaaa");
Collections.sort(array);
System.out.println("升序排列的結果:");
for(String str:array)
System.out.println(str);
Collections.reverse(array);
System.out.println("降序排列的結果:");
for(String str:array)
System.out.println(str);
}
}
輸出結果為:
升序排列的結果:
aaaaa
bbbbb
ccccc
ddddd
降序排列的結果:
ddddd
ccccc
bbbbb
aaaaa
而通過以下
指定比較器也是可以實現的:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


public class Sort1 implements Comparator<String>
{
private final static int UP = 1;
private final static int DOWN = -1;
private int state;


public Sort1(int state)
{
this.state = state;
}


public int compare(String o1, String o2)
{
return (state == Sort1.DOWN)? sortDown(o1, o2): sortUp(o1, o2);
}


private int sortUp(String o1, String o2)
{

if (o1.compareTo(o2) < 0)
{
return -1;

} else if (o1.compareTo(o2) > 0)
{
return 1;

} else
{
return 0;
}
}


private int sortDown(String o1, String o2)
{

if (o1.compareTo(o2) > 0)
{
return -1;

} else if (o1.compareTo(o2) < 0)
{
return 1;

} else
{
return 0;
}
}


public static void main(String[] args)
{
ArrayList<String> array = new ArrayList<String>();
array.add("ccccc");
array.add("bbbbb");
array.add("ddddd");
array.add("aaaaa");
//sort(List<T> list, Comparator<? super T> c) 根據指定比較器產生的順序對指定列表進行排序
Collections.sort(array, new Sort1(Sort1.UP));
System.out.println("升序排列的結果:");

for (String str : array)
{
System.out.println(str);
}
Collections.sort(array, new Sort1(Sort1.DOWN));
System.out.println("降序排列的結果:");

for (String str : array)
{
System.out.println(str);
}
}
}
其輸出結果同上。而當我們需要處理的是對象數組(非String)時,數組的自然序列我們是不知道的,所以,需要使用Comparator進行整體排序(關于Comparator請參見jdk-api 1.6),實現Comparator接口,便要實現其中的
compare(T o1, T o2)
。以下程序是進行比較名字,按照lastName優先,firstName其次的原則。
import java.util.*;


public class Sort2
{

public static void main(String[] args)
{
ArrayList<Name> name = new ArrayList<Name>();
name.add(new Name("John", "Lennon"));
name.add(new Name("Karl", "Marx"));
name.add(new Name("Groucho", "Marx"));
name.add(new Name("Oscar", "Grouch"));
Collections.sort(name, new Name(new String(), new String()));
for (Name i : name)
System.out.println(i.toString());
}
}


class Name implements Comparator<Name>
{
public String firstName, lastName;


public Name(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}


public int compare(Name n1, Name n2)
{
int Cmp = n1.lastName.compareTo(n2.lastName);
return (Cmp != 0 ? Cmp : (n2.firstName).compareTo(n1.firstName));
}


public String toString()
{
return firstName + " " + lastName;
}
}
輸出結果為:
Oscar Grouch
John Lennon
Karl Marx
Groucho Marx
(G<L<M 當M相等時,K<G,所以得此輸出)對于這種方式,我覺得應該會有更簡潔的方式,尤其是對于
Collections.sort(name, new Name(new String(), new String()));
這句話,但我不知道怎樣的實現會更好。