容易忽视但是功能灰常强大的Java API(一、排序)

这几天看了一些用java编写的程序代码,发现了很多以前不知道的api功能。原以为自己还算得上是一个java语言的中级学习者,现在看来自己只是一个java初级学习者,对java的认识一直只是停留在java的表层,解决一些应用问题只是毫无新意地将一些已知的常用接口、数据结构等翻来覆去地使用,没有更深地去了解这门语言。事实上java提供了很多功能非常强大的接口,能够很方便地为我们解决一些实际的问题,下面就具体介绍几个我最近了解的java API功能。

一. 排序

在编写java程序的时候,我们经常都会遇到排序的问题,没有深入学习过java的人一般会选择两种做法,第一种是在网上找一段代码改改后就用在自己的程序中,第二种是自己花时间写一个。当然对第一种方法如果你看懂了网上找的代码还有点点收获,对第二种方法则可以证明你是一个认真的人,对一些排序算法有比较深刻的研究,但是倘若你写的不是很精妙的排序算法,而只是写一个普通的选择、冒泡、插入亦或是更高级一点的堆排、快排、归并之类的算法,在你对这些算法已经比较熟悉的情况下,这样自己写是没有多大意义的,相反会浪费不少时间。

事实上java语言已经为它的使用者考虑到了排序的需求,提供了集合排序的函数调用,如下所示:

java.util.Arrays.sort(int[])
java.util.Arrays.sort(int[], int, int)
java.util.Arrays.sort(T[], int, int, java.util.Comparator)
java.util.Arrays.sort(T[], java.util.Comparator)
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)

上面所列的是可能会经常用到的函数接口,还有其它一些重载的函数,感兴趣的可以可以查一查api说明文档。下面是一个例子:

//集合排序    
public class ArraySort {     
    //对整数集合进行排序     
    public void sortIntArray() {     
        int[] array = new int[] { 8, 5, 9, 0, 6, 3, 4, 7, 2, 1 };     
        System.out.println("整数排序前");     
        for (int i = 0; i < array.length; i++) {     
            System.out.print(array[i] + " ");     
        }     
        System.out.println();     
        Arrays.sort(array);        
        System.out.println("整数排序后");     
        for (int i = 0; i < array.length; i++) {     
            System.out.print(array[i] + " ");     
        }     
        System.out.println();     
    }     
    //对字符串集合进行排序     
    public void sortStringArray() {     
        String[] array = new String[] { "a", "c", "e", "d", "b" };     
        System.out.println("字符串排序前");     
        for (int i = 0; i < array.length; i++) {     
            System.out.print(array[i] + " ");     
        }     
        System.out.println();     
        System.out.println("字符串排序后");     
        Arrays.sort(array);        
        for (int i = 0; i < array.length; i++) {     
            System.out.print(array[i] + " ");     
        }     
        System.out.println();     
    }     
    //对对象集合进行排序     
    public void sortObjectArray() {     
        Dog o1 = new Dog("dog1", 1);     
        Dog o2 = new Dog("dog2", 4);     
        Dog o3 = new Dog("dog3", 5);     
        Dog o4 = new Dog("dog4", 2);     
        Dog o5 = new Dog("dog5", 3);     
        Dog[] dogs = new Dog[] { o1, o2, o3, o4, o5 };     
        System.out.println("对象排序前");     
        for (int i = 0; i < dogs.length; i++) {     
            Dog dog = dogs[i];     
            System.out.print(dog.getName() + ":" + dog.getWeight()+ " ");     
        }     
        System.out.println();     
       Arrays.sort(dogs, new ByWeightComparator());        
        System.out.println("对象排序后");     
        for (int i = 0; i < dogs.length; i++) {     
            Dog dog = dogs[i];     
            System.out.print(dog.getName() + ":" + dog.getWeight()+ " ");     
        }     
        System.out.println();     
    }

    public static void main(String[] args) {    
        ArraySort t = new ArraySort();     
        t.sortIntArray();     
        t.sortStringArray();     
        t.sortObjectArray();     
    }     
}

//测试对象Dog    
class Dog {     
    private String name;     
    private int weight;

    public Dog(String name, int weight) {    
        this.setName(name);     
        this.weight = weight;     
    }

    public int getWeight() {    
        return weight;     
    }

    public void setWeight(int weight) {    
        this.weight = weight;     
    }

    public void setName(String name) {    
        this.name = name;     
    }

    public String getName() {    
        return name;     
    }     
}

//比较器,以Dog的重量作为比较的基准    
class ByWeightComparator implements Comparator {      
    public int compare(Dog o1, Dog o2) {       
        int diff = o1.getWeight() - o2.getWeight();       
        if (diff > 0)       
            return 1;       
        if (diff < 0)       
            return -1;       
        else       
            return 0;       
    }       
}

程序运行结果:

整数排序前    
8 5 9 0 6 3 4 7 2 1      
整数排序后     
0 1 2 3 4 5 6 7 8 9      
字符串排序前     
a c e d b      
字符串排序后     
a b c d e      
对象排序前     
dog1:1 dog2:4 dog3:5 dog4:2 dog5:3      
对象排序后     
dog1:1 dog4:2 dog5:3 dog2:4 dog3:5

注意,对对象集合进行排序时,需要提供一个比较器,比较器需要实现Comparator接口并实现接口的compare方法。另外值得注意的是compare函数返回值的意义,它是拿参数中的第一个对象与第二个对象进行比较,若大于则返回1,小于则返回-1,等于则返回0。不要在函数实现体中将两个对象对数弄倒了!

posted on 2011-07-01 10:47  GongTao  阅读(2703)  评论(1编辑  收藏  举报

导航