`
jeafyezheng
  • 浏览: 99960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java 中排序方法

阅读更多

简单类型的排序<o:p></o:p>

简单类型不外是byte, char, short, int, long, float, double等数据类型, 这些类型不能放在聚集中,只能使用数组。java.util.Arrays方法提供了对这些类型的sort方法(实际上还有很多其他有用的方法),下面是对一个简单的int数组排序:

       int[] arr = {2, 3, 1,10,7,4};<o:p></o:p>

<o:p> </o:p>

       System.out.print("before sort: ");<o:p></o:p>

       for (int i = 0; i< arr.length; i++)<o:p></o:p>

           System.out.print(arr[i] + " ");<o:p></o:p>

       System.out.println();       <o:p></o:p>

<o:p> </o:p>

       Arrays.sort(arr);<o:p></o:p>

       System.out.print("after sort: ");<o:p></o:p>

       for (int i = 0; i< arr.length; i++)<o:p></o:p>

           System.out.print(arr[i] + " ");<o:p></o:p>

       System.out.println();       <o:p></o:p>

输出结果:

before sort: 2 3 1 10 7 4 <o:p></o:p>

after sort: 1 2 3 4 7 10<o:p></o:p>

我们看到排序结果是按照升序排列的,下面的排序都是如此。

<o:p> </o:p>

对象的排序<o:p></o:p>

对象可以放在数组里,同样调用Arrays.sort(Object[] arr)即可;也可以放到聚集里,用java.util.Collectionssort(List list)。注意不是list必须实现List接口而不仅仅是Collection接口。

但是这个类必须实现了java.lang.Comparable接口。这个接口只有一个方法:int compartTo(Object o),当本对象比传入的对象大时,返回一个正整数。 以类Programmer为例:

class Programmer implements Comparable{<o:p></o:p>

    private String name;<o:p></o:p>

    private String language;<o:p></o:p>

    private double pay;<o:p></o:p>

    <o:p></o:p>

    public Programmer(String name, String language, double pay) {<o:p></o:p>

       this.name = name;<o:p></o:p>

       this.language = language;<o:p></o:p>

       this.pay = pay;<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

    public int compareTo(Object o) {<o:p></o:p>

       Programmer other = (Programmer)o;<o:p></o:p>

       return (int)pay - (int)other.pay;<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

    public String toString(){<o:p></o:p>

       return "{name: " + name + ", language: " + language + ", money: " + pay + "}";<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

对其进行排序:

       ArrayList list = new ArrayList();<o:p></o:p>

       list.add(new Programmer("张三", "C", 12000));<o:p></o:p>

       list.add(new Programmer("李四", "Java", 200));<o:p></o:p>

       list.add(new Programmer("王五", "C++", 5000));<o:p></o:p>

       list.add(new Programmer("钱六", "VB", 3000));<o:p></o:p>

       System.out.println("before sort: " + list);<o:p></o:p>

       Collections.sort(list);<o:p></o:p>

       System.out.println("after sort: " + list);    <o:p></o:p>

输出:<o:p></o:p>

before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language: Java, money: 200.0}, {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]<o:p></o:p>

after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language: VB, money: 3000.0}, {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]<o:p></o:p>

<o:p> </o:p>

够简单吧!查查Comparablejavadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。

最近看C#发现其中用System.Array.sort对数组排序,适用于所有实现了IComparable接口的对象,看来微软的借鉴能力还真是强啊!

<o:p> </o:p>

对已有类进行排序<o:p></o:p>

上面的方法有一个问题,就是一个类已经存在了,并且没有实现Comparable接口,使用一个子类进行封装?很麻烦(你可以对下面的例子试试)。还有一种情况就是对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,但是是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情况,使用java.util包的Comparator接口:

Arrays.sort(Object[] arr, Comparator com)

Collections.sort(Object[] arr, Comparator com)

Comparator接口的方法:<o:p></o:p>

public int compare(Object o1, Object o2) o1o2大时返回一个正整数<o:p></o:p>

public boolean equals(Object obj)  判断obj与这个Comparator是否同一个对象<o:p></o:p>

下面使用Comparator对文件实现了按文件大小或修改时间排序:<o:p></o:p>

class FileUtils {<o:p></o:p>

    static class CompratorByLastModified implements Comparator {<o:p></o:p>

       public int compare(Object o1, Object o2) {<o:p></o:p>

           File file1 = (File)o1;<o:p></o:p>

           File file2 = (File)o2;<o:p></o:p>

           long diff = file1.lastModified() - file2.lastModified();<o:p></o:p>

           if (diff > 0)<o:p></o:p>

              return 1;<o:p></o:p>

           else if (diff == 0)<o:p></o:p>

              return 0;<o:p></o:p>

           else<o:p></o:p>

              return -1;<o:p></o:p>

       }<o:p></o:p>

       <o:p></o:p>

       public boolean equals(Object obj){<o:p></o:p>

           return true;  //简单做法<o:p></o:p>

       }<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

    static class CompratorBySize implements Comparator {<o:p></o:p>

       public int compare(Object o1, Object o2) {<o:p></o:p>

           File file1 = (File)o1;<o:p></o:p>

           File file2 = (File)o2;<o:p></o:p>

           long diff = file1.length() - file2.length();<o:p></o:p>

           if (diff > 0)<o:p></o:p>

              return 1;<o:p></o:p>

           else if (diff == 0)<o:p></o:p>

              return 0;<o:p></o:p>

           else<o:p></o:p>

              return -1;<o:p></o:p>

       }<o:p></o:p>

       <o:p></o:p>

       public boolean equals(Object obj){<o:p></o:p>

           return true</st>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics