简单类型的排序<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.Collections的sort(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>
够简单吧!查查Comparable的javadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。
最近看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) 当o1比o2大时返回一个正整数<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>
分享到:
相关推荐
java 冒泡排序方法,java 冒泡排序方法。
java实现中文排序,按数字字母汉字的顺序进行排序
Java排序方法详解大全 Java排序 快速排序 冒泡排序
java排序方法 java排序方法 java排序方法 java排序方法
java 中文姓氏 排序
Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序
java冒泡排序集锦方法!所有的方法都有!很不错的!希望对大家有帮助哈哈!
在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[] arrays = new String[] { gyu, sdf, zf, 大同, 收到, 地方, 三等分, 的人, 反对高铁, 泛代数, 上的投入...
附件为以上方法必须用到的包,有朋友问到,现提供下载。 博文链接:https://ReturnOfKing.iteye.com/blog/248274
提供了Java实现几种常见排序方法和原理介绍
简单的8种排序方法,有冒泡排序,基本排序,快速排序等等等等
java中集合排序
java中数组的自定义排序,种类繁多,简单实现,可自由操控。
JAVA排序汇总JAVA排序汇总JAVA排序汇总
java数组排序的思想,过程和代码实现。多种数组排序的方法,主要有冒泡排序,堆排序,插入排序, 归并操作(merge), 归并操作(merge),选择排序,希尔排序。
java 选择排序法 java 选择排序法 java 选择排序法
Java几种排序方法:冒泡排序,插入法排序,快速排序,选择排序.
Java基础知识: 冒泡排序详解,简单而详细的讲清楚了,什么是冒泡排序。 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如...
JAVA中排序的方法