`
tutu66
  • 浏览: 5019 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java API提供的方法实现排序 如file按日期和大小排序

    博客分类:
  • Java
阅读更多
java API提供的方法实现排序 如file按日期和大小排序
2008-10-06 23:25

 

摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序,不论是简单类型还是类,数组还是Java聚集(Collection)。

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

   int[] arr = {2, 3, 1,10,7,4};

   System.out.print("before sort: ");
   for (int i = 0; i< arr.length; i++)
    System.out.print(arr[i] + " ");
   System.out.println();  

   Arrays.sort(arr);
   System.out.print("after sort: ");
   for (int i = 0; i< arr.length; i++)
    System.out.print(arr[i] + " ");
   System.out.println();  
输出结果:
before sort: 2 3 1 10 7 4 
after sort: 1 2 3 4 7 10

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

对象的排序
对象可以放在数组里,同样调用Arrays.sort(Object[] arr)即可;也可以放到聚集里,用java.util.Collections的sort(List list)。注意不是list必须实现List接口而不仅仅是Collection接口。
但是这个类必须实现了java.lang.Comparable接口。这个接口只有一个方法:int compartTo(Object o),当本对象比传入的对象大时,返回一个正整数。 以类Programmer为例:

class Programmer implements Comparable{
private String name;
private String language;
private double pay;

public Programmer(String name, String language, double pay) {
   this.name = name;
   this.language = language;
   this.pay = pay;
}

public int compareTo(Object o) {
   Programmer other = (Programmer)o;
   return (int)pay - (int)other.pay;
}

public String toString(){
   return "{name: " + name + ", language: " + language + ", money: " + pay + "}";
}
}
对其进行排序:
   ArrayList list = new ArrayList();
   list.add(new Programmer("张三", "C", 12000));
   list.add(new Programmer("李四", "Java", 200));
   list.add(new Programmer("王五", "C++", 5000));
   list.add(new Programmer("钱六", "VB", 3000));
   System.out.println("before sort: " + list);
   Collections.sort(list);
   System.out.println("after sort: " + list); 
输出:
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}]
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}]

 

够简单吧!查查Comparable的javadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。
最近看C#发现其中用System.Array.sort对数组排序,适用于所有实现了IComparable接口的对象,看来微软的借鉴能力还真是强啊!

对已有类进行排序
上面的方法有一个问题,就是一个类已经存在了,并且没有实现Comparable接口,使用一个子类进行封装?很麻烦(你可以对下面的例子试试)。还有一种情况就是对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,但是是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情况,使用java.util包的Comparator接口:
Arrays.sort(Object[] arr, Comparator com)
Collections.sort(Object[] arr, Comparator com)
Comparator接口的方法:
public int compare(Object o1, Object o2) 当o1比o2大时返回一个正整数
public boolean equals(Object obj) 判断obj与这个Comparator是否同一个对象

 

 

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

class FileUtils {
static class CompratorByLastModified implements Comparator {
   public int compare(Object o1, Object o2) {
    File file1 = (File)o1;
    File file2 = (File)o2;
    long diff = file1.lastModified() - file2.lastModified();
    if (diff > 0)
     return 1;
    else if (diff == 0)
     return 0;
    else
     return -1;
   }
  
   public boolean equals(Object obj){
    return true; //简单做法
   }
}

static class CompratorBySize implements Comparator {
   public int compare(Object o1, Object o2) {
    File file1 = (File)o1;
    File file2 = (File)o2;
    long diff = file1.length() - file2.length();
    if (diff > 0)
     return 1;
    else if (diff == 0)
     return 0;
    else
     return -1;
   }
  
   public boolean equals(Object obj){
    return true; //简单做法
   }
}

}
调用的示例:
   File dir = new File("C:\\temp");
   File[] files = dir.listFiles();

   System.out.print("before sort: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  
  
   Arrays.sort(files);
   System.out.print("sort by name: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  

   Arrays.sort(files, new FileUtils.CompratorBySize());
   System.out.print("sort by size: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  

   Arrays.sort(files, new FileUtils.CompratorByLastModified());
   System.out.print("sort by last modified: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  
  

 
自己找个目录试一下吧。用这些Java类库中的方法,一般情况下应该是不用自己写排序算法了吧?

 

 

 

 

 

 

 最后附上完整代码占点版面:

 

TestSort.java
import java.io.*;
import java.util.*;

public class TestSort {

public static void main(String[] args) {
   sortSimpleType();
   sortComparable();
   sortComparator();
}

public static void sortSimpleType() {
   int[] arr = {2, 3, 1,10,7,4};

   System.out.print("before sort: ");
   for (int i = 0; i< arr.length; i++)
    System.out.print(arr[i] + " ");
   System.out.println();  

   Arrays.sort(arr);
   System.out.print("after sort: ");
   for (int i = 0; i< arr.length; i++)
    System.out.print(arr[i] + " ");
   System.out.println();  
}

public static void sortComparable() {
   ArrayList list = new ArrayList();
   list.add(new Programmer("张三", "C", 12000));
   list.add(new Programmer("李四", "Java", 200));
   list.add(new Programmer("王五", "C++", 5000));
   list.add(new Programmer("钱六", "VB", 3000));
   System.out.println("before sort: " + list);
   Collections.sort(list);
   System.out.println("after sort: " + list); 
}

public static void sortComparator() {
   File dir = new File("C:\\temp");
   File[] files = dir.listFiles();

   System.out.print("before sort: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  
  
   Arrays.sort(files);
   System.out.print("sort by name: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  

   Arrays.sort(files, new FileUtils.CompratorBySize());
   System.out.print("sort by size: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  

   Arrays.sort(files, new FileUtils.CompratorByLastModified());
   System.out.print("sort by last modified: ");
   for (int i = 0; i< files.length; i++)
    System.out.print(files[i] + " ");
   System.out.println();  
  
}
}

class Programmer implements Comparable{
private String name;
private String language;
private double pay;

public Programmer(String name, String language, double pay) {
   this.name = name;
   this.language = language;
   this.pay = pay;
}

public int compareTo(Object o) {
   Programmer other = (Programmer)o;
   return (int)pay - (int)other.pay;
}

public String toString(){
   return "{name: " + name + ", language: " + language + ", money: " + pay + "}";
}
}

class FileUtils {
static class CompratorByLastModified implements Comparator {
   public int compare(Object o1, Object o2) {
    File file1 = (File)o1;
    File file2 = (File)o2;
    long diff = file1.lastModified() - file2.lastModified();
    if (diff > 0)
     return 1;
    else if (diff == 0)
     return 0;
    else
     return -1;
   }
  
   public boolean equals(Object obj){
    return true; //简单做法
   }
}

static class CompratorBySize implements Comparator {
   public int compare(Object o1, Object o2) {
    File file1 = (File)o1;
    File file2 = (File)o2;
    long diff = file1.length() - file2.length();
    if (diff > 0)
     return 1;
    else if (diff == 0)
     return 0;
    else
     return -1;
   }
  
   public boolean equals(Object obj){
    return true; //简单做法
   }
}

 

分享到:
评论
1 楼 whizkid 2012-03-30  
学习了,谢谢LZ分享

相关推荐

    java文件夹按时间、大小等排序

    这里我们将深入探讨如何使用Java实现文件按时间、大小等属性进行排序的功能。 首先,我们要引入`java.io.File`类,它是Java中用于表示文件和目录的基本类。我们可以创建`File`对象来代表一个具体的文件或目录,然后...

    JavaAPI--1.6

    Java API是Java开发的核心组成部分,它为开发者提供了丰富的类库和接口,使得开发人员能够构建出功能强大的应用程序和系统。在Java 1.6版本中,API包含了大量用于处理各种编程任务的类和方法,包括但不限于输入/输出...

    java常用API举例

    9. **日期时间API**:Java 8引入了新的日期时间API,如LocalDate、LocalTime、LocalDateTime,提供了更强大和灵活的日期时间操作。例如: ```java LocalDate today = LocalDate.now(); LocalTime currentTime = ...

    Java api 文档

    Java API文档是Java开发者不可或缺的参考资料,它详细记录了Java平台标准版(Java SE)的所有公共类、接口、方法和异常等。这份文档是Oracle公司官方提供的,包含了JDK(Java Development Kit)中的核心库,如java....

    Java 1.8 API 帮助文档-中文版

    Path类替代了File,Files类提供了一系列静态方法处理路径和文件操作,如copy(), delete(), readAllBytes()等。 最后,提到的是反射API的增强,如MethodHandle和invokedynamic指令,这些对于动态语言支持和元编程...

    Java学习常用API

    在Java编程语言中,API(Application Programming Interface)是一组预定义的类、接口、方法和其他组件,它们提供了标准的方式来实现特定的功能。Java API是Java开发的核心组成部分,它为程序员提供了丰富的功能,...

    javaAPI中常用类的使用

    Java 8引入了`LocalDate`, `LocalTime`和`LocalDateTime`,它们提供了更为简洁的日期和时间API。 `Exception`类是异常处理的基础,当程序运行出现错误时,会抛出异常。通过`try-catch`语句块,我们可以捕获并处理...

    java常用API-适合初学者

    Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了各种类库、接口和异常,为开发者提供了丰富的功能,使得开发Java程序变得更加高效和便捷。本资料“java常用API-适合初学者”旨在帮助初学者...

    Java API 1.6

    - **NIO.2**:引入了New I/O 2,提供了文件系统操作的新API,如`java.nio.file`包,支持异步I/O,以及文件属性和权限的操作。 - **`Path`接口**:提供了表示文件路径的统一抽象,简化了跨平台的文件操作。 4. **...

    JavaAPI部分练习代码全注释

    这个压缩包“JavaAPI部分练习代码全注释”显然是为了帮助Java初学者或者有经验的开发者巩固和深化对Java API的理解而准备的。以下是一些关于Java API的重要知识点: 1. **基础类库**:Java API包括了I/O流、集合...

    Java中文API帮助文档

    Java中文API帮助文档是Java开发者不可或缺的参考资料,它详尽地介绍了Java编程语言的各种类库、接口、方法和异常,为程序员提供了清晰的指引。这个文档的特点在于其完全使用中文编写,使得国内开发者在查阅时能更加...

    java1.7 中文api

    以上只是Java 1.7 API的一部分关键知识点,实际API包含了许多其他类库和接口,如XML处理、数据库连接、国际化和日期时间处理等。对于Java开发者来说,深入理解这些API是非常重要的,这将有助于编写高效、健壮且易于...

    java _api.zip

    7. **日期和时间API**:在Java 8中,引入了新的日期和时间API(java.time包),如LocalDate、LocalTime、LocalDateTime等,替代了旧的java.util.Date和Calendar,提供了更加友好和强大的日期时间操作功能。...

    java api 帮助文档

    Java API(应用程序接口)是Java编程语言的核心组成部分,它提供了大量的预先定义的类和方法,使得开发者能够方便地实现各种功能。这份“Java API 帮助文档”是英语版的,涵盖了Java SE(标准版)6的完整API,对于...

    java API文档

    2. `java.util`包:提供了许多实用工具类,如集合框架(List、Set、Queue等)、日期和时间API(Date、Calendar)、随机数生成器、以及排序和遍历算法。`ArrayList`和`HashMap`是常用的数据结构,而`Scanner`则用于从...

    JAVA_API_1.7中文 完整高清版 CHM版

    - **文件系统API增强**:通过`java.nio.file`包提供了新的文件系统API,支持更强大的文件操作,如文件属性查询、文件路径操作和文件遍历等。 - **类型推断**:引入了`钻石操作符&lt;&gt;`,在创建泛型实例时可以省略类型...

    个人笔记--Java_API

    - **操作**:集合提供了更多复杂的数据操作功能,如搜索、排序等,而数组通常仅提供简单的索引访问。 **1.3 Java集合类** Java集合框架主要包括以下几种类型: - **Collection**:单列集合,包括List和Set。 - *...

    Java API函数大全

    通过以上详细的介绍,我们可以看到Java API中包含了丰富的文件操作和进程间通信相关的函数,这些函数为Java开发者提供了强大的工具,使得他们能够更加高效地完成各种任务。深入理解和熟练运用这些API,不仅能够提升...

    javaAPI大全,从基础到开发

    首先,Java API是Java Development Kit(JDK)的核心组成部分,它定义了Java语言的标准库,提供了大量预先构建的类和方法,用于处理常见的编程任务,如输入输出、网络通信、数据结构、图形用户界面等。Java API文档...

    JAVA API1.6中文文档.zip_java api中文_java 文档

    Java API 1.6中文文档是对Java 2 Platform Standard Edition 6.0(J2SE 6.0)的API规范的重要参考资料,它为开发者提供了详细的API接口、类和方法的说明,帮助开发者理解并有效地使用Java编程语言。这篇文档包含了...

Global site tag (gtag.js) - Google Analytics