摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序,不论是简单类型还是类,数组还是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; //简单做法
}
}
相关推荐
这里我们将深入探讨如何使用Java实现文件按时间、大小等属性进行排序的功能。 首先,我们要引入`java.io.File`类,它是Java中用于表示文件和目录的基本类。我们可以创建`File`对象来代表一个具体的文件或目录,然后...
Java API是Java开发的核心组成部分,它为开发者提供了丰富的类库和接口,使得开发人员能够构建出功能强大的应用程序和系统。在Java 1.6版本中,API包含了大量用于处理各种编程任务的类和方法,包括但不限于输入/输出...
9. **日期时间API**:Java 8引入了新的日期时间API,如LocalDate、LocalTime、LocalDateTime,提供了更强大和灵活的日期时间操作。例如: ```java LocalDate today = LocalDate.now(); LocalTime currentTime = ...
Java API文档是Java开发者不可或缺的参考资料,它详细记录了Java平台标准版(Java SE)的所有公共类、接口、方法和异常等。这份文档是Oracle公司官方提供的,包含了JDK(Java Development Kit)中的核心库,如java....
Path类替代了File,Files类提供了一系列静态方法处理路径和文件操作,如copy(), delete(), readAllBytes()等。 最后,提到的是反射API的增强,如MethodHandle和invokedynamic指令,这些对于动态语言支持和元编程...
在Java编程语言中,API(Application Programming Interface)是一组预定义的类、接口、方法和其他组件,它们提供了标准的方式来实现特定的功能。Java API是Java开发的核心组成部分,它为程序员提供了丰富的功能,...
Java 8引入了`LocalDate`, `LocalTime`和`LocalDateTime`,它们提供了更为简洁的日期和时间API。 `Exception`类是异常处理的基础,当程序运行出现错误时,会抛出异常。通过`try-catch`语句块,我们可以捕获并处理...
Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了各种类库、接口和异常,为开发者提供了丰富的功能,使得开发Java程序变得更加高效和便捷。本资料“java常用API-适合初学者”旨在帮助初学者...
- **NIO.2**:引入了New I/O 2,提供了文件系统操作的新API,如`java.nio.file`包,支持异步I/O,以及文件属性和权限的操作。 - **`Path`接口**:提供了表示文件路径的统一抽象,简化了跨平台的文件操作。 4. **...
这个压缩包“JavaAPI部分练习代码全注释”显然是为了帮助Java初学者或者有经验的开发者巩固和深化对Java API的理解而准备的。以下是一些关于Java API的重要知识点: 1. **基础类库**:Java API包括了I/O流、集合...
Java中文API帮助文档是Java开发者不可或缺的参考资料,它详尽地介绍了Java编程语言的各种类库、接口、方法和异常,为程序员提供了清晰的指引。这个文档的特点在于其完全使用中文编写,使得国内开发者在查阅时能更加...
以上只是Java 1.7 API的一部分关键知识点,实际API包含了许多其他类库和接口,如XML处理、数据库连接、国际化和日期时间处理等。对于Java开发者来说,深入理解这些API是非常重要的,这将有助于编写高效、健壮且易于...
7. **日期和时间API**:在Java 8中,引入了新的日期和时间API(java.time包),如LocalDate、LocalTime、LocalDateTime等,替代了旧的java.util.Date和Calendar,提供了更加友好和强大的日期时间操作功能。...
Java API(应用程序接口)是Java编程语言的核心组成部分,它提供了大量的预先定义的类和方法,使得开发者能够方便地实现各种功能。这份“Java API 帮助文档”是英语版的,涵盖了Java SE(标准版)6的完整API,对于...
2. `java.util`包:提供了许多实用工具类,如集合框架(List、Set、Queue等)、日期和时间API(Date、Calendar)、随机数生成器、以及排序和遍历算法。`ArrayList`和`HashMap`是常用的数据结构,而`Scanner`则用于从...
- **文件系统API增强**:通过`java.nio.file`包提供了新的文件系统API,支持更强大的文件操作,如文件属性查询、文件路径操作和文件遍历等。 - **类型推断**:引入了`钻石操作符<>`,在创建泛型实例时可以省略类型...
- **操作**:集合提供了更多复杂的数据操作功能,如搜索、排序等,而数组通常仅提供简单的索引访问。 **1.3 Java集合类** Java集合框架主要包括以下几种类型: - **Collection**:单列集合,包括List和Set。 - *...
通过以上详细的介绍,我们可以看到Java API中包含了丰富的文件操作和进程间通信相关的函数,这些函数为Java开发者提供了强大的工具,使得他们能够更加高效地完成各种任务。深入理解和熟练运用这些API,不仅能够提升...
首先,Java API是Java Development Kit(JDK)的核心组成部分,它定义了Java语言的标准库,提供了大量预先构建的类和方法,用于处理常见的编程任务,如输入输出、网络通信、数据结构、图形用户界面等。Java API文档...
Java API 1.6中文文档是对Java 2 Platform Standard Edition 6.0(J2SE 6.0)的API规范的重要参考资料,它为开发者提供了详细的API接口、类和方法的说明,帮助开发者理解并有效地使用Java编程语言。这篇文档包含了...