本文演示了在一个java文件中集成了两种排序方式,自定义冒泡排序算法进行区别于JDK的内置排序算法。
传统模式下的两种排序算法:
/**
* JAVA两种排序复习
* 针对具体对象编写相应的排序代码,这一部分是经常变动的部分
* 排序Arrays.sort方法为不变的部分,封装了具体排序算法
* 两者结合,一个策略模式出来了
*
* @author xiaomin
*/
public class Person implements Serializable, Comparable<Person> {
private static final long serialVersionUID = -23536L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 正序排列,针对具体bean的排序,经常变动的部分
public int compareTo(Person o) {
if (o == null)
return -1;
return this.getAge() < o.getAge() ? -1 : (this.getAge() == o.getAge() ? 0 : 1);
}
public String toString() {
return "name : " + getName() + " age : " + getAge();
}
public static void main(String... args) {
Person[] persons = { new Person("a", 12), new Person("b", 10),
new Person("demo", 23), new Person("hello", 22),
new Person("hello", 32) };
System.out.println("排序前 ......");
System.out.println(Arrays.toString(persons));
System.out.println("排序后 ......");
Arrays.sort(persons);
System.out.println(Arrays.toString(persons));
System.out.println("使用自定义排序 ......");
// 适用于没有继承Comparable的bean或需要自行定制的排序方式
Arrays.sort(persons, new Comparator<Person>() {
public int compare(Person o1, Person o2) {// 倒叙排列
return o1.getAge() > o2.getAge() ? -1 : (o1.getAge() == o2.getAge() ? 0 : 1);
}
});
System.out.println(Arrays.toString(persons));
}
}
一般还是建议使用JDK内置的排序算法,当然我们还是可以自己编写自定义的排序算法,下面代码仅仅为了演示。
/**
* 自定义冒泡排序算法,演示使用,用以替代系统默认的Arrays.sort
* @author xiaomin
*
*/
public class BubbleSort {
public static void main(String[] args) {
Person[] persons = { new Person("a", 12), new Person("b", 10),
new Person("demo", 23), new Person("hello", 22),
new Person("hello", 32) };
System.out.println("排序前 ......");
System.out.println(Arrays.toString(persons));
System.out.println("排序后 ......");
bubble(persons);
System.out.println(Arrays.toString(persons));
System.out.println("使用自定义排序 ......");
// 适用于没有继承Comparable的bean或需要自行定制的排序方式
bubble(persons, new Comparator<Person>() {
public int compare(Person o1, Person o2) {// 倒叙排列
return o1.getAge() > o2.getAge() ? -1 : (o1.getAge() == o2.getAge() ? 0 : 1);
}
});
System.out.println(Arrays.toString(persons));
}
public static <T> void bubble(T [] ts, Comparator<? super T> c){
for(int i = 0; i < ts.length; i ++){
for(int j = ts.length -1; j > i; j--){
if(c.compare(ts[j-1], ts[j]) > 0){
swap(ts, j-1, j);
}
}
}
}
public static <T extends Comparable<T>> void bubble(T [] ts){
for(int i = 0; i < ts.length; i ++){
for(int j = ts.length -1; j > i; j--){
if(ts[j-1].compareTo(ts[j]) > 0){
swap(ts, j-1, j);
}
}
}
}
private static <T> void swap(T [] ints,int index1, int index2){
T temp = ints[index1];
ints[index1] = ints[index2];
ints[index2] = temp;
}
}
两种排序输出结果:
排序前 ......
[name : a age : 12, name : b age : 10, name : demo age : 23, name : hello age : 22, name : hello age : 32]
排序后 ......
[name : b age : 10, name : a age : 12, name : hello age : 22, name : demo age : 23, name : hello age : 32]
使用自定义排序 ......
[name : hello age : 32, name : demo age : 23, name : hello age : 22, name : a age : 12, name : b age : 10]
若有时间,也可以实现其它常见的排序算法。
关于 Arrays的Sort算法分析 :
http://www.slideshare.net/zianed/arrayssort 可以参考一下。