聂永的博客

记录工作/学习的点点滴滴。

JAVA 两种排序方式复习

本文演示了在一个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 可以参考一下。

posted on 2010-10-05 17:24 nieyong 阅读(702) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航:
 

公告

所有文章皆为原创,若转载请标明出处,谢谢~

新浪微博,欢迎关注:

导航

<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(58)

随笔分类(130)

随笔档案(151)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜