[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
我们实现一个排序类,使其可以实现对数组中元素进行排序,以及打印数组的功能。如下所示,可以这样设计:
DataSorter.java
/**
* 排序类
*
* @author jesson
*
*/
public class DataSorter {
/**
* 冒泡排序方法
*
* @param a
*/
public static void bubbleSort(int[] a) {
for (int i = a.length - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
swap(a, j, j + 1);
}
}
}
}
/**
* 交换两个数据
*
* @param a
* 数组
* @param x
* 数组下标1
* @param y
* 数组下标2
*/
private static void swap(int[] a, int x, int y) {
// TODO Auto-generated method stub
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
/**
* 打印数组
*
* @param a
*/
public static void print(int[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}</span>
Test.java
/**
* 测试类
* @author jesson
*
*/
public class Test {
public static void main(String[] args) {
int[] a = new int[]{9,8,2,4,5,6,7};
DataSorter.print(a);
DataSorter.bubbleSort(a);
DataSorter.print(a);
}
}
</span>
通过这个DataSorter可以实现将数组进行冒泡排序,以及输出数组的功能。
但是现在,需求变了,我们不仅要实现对整数数组进行排序,还要对float型和double型数组进行排序,当然了,想必大家也想到了,这可以重载排序方法,以实现不同类型的数组进行排序,是,这是一种方法。但是,现在需求又变了,不仅要实现对这些常规类型的数组进行排序,还要对其他自定义的一些类进行排序,如,我们要对Cat进行排序,并输出,这是怎么做呢??想必大家很容易想到用重载,如下,可以这样写:
Cat.java
/**
* Cat类 有属性身高,体重及toString()方法
*
* @author jesson
*
*/
public class Cat {
private int height; // 身高
private int weight; // 体重
public Cat(int height, int weight) {
// TODO Auto-generated constructor stub
this.height = height;
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
/**
* 重写toString()方法
*/
@Override
public String toString() {
return this.getHeight() + "|" + this.getWeight();
}
}
</span>
DataSorter.java
/**
* 排序类
*
* @author jesson
*
*/
public class DataSorter {
/**
* 冒泡排序方法
*
* @param Cat类型数组
*/
public static void bubbleSort(Cat[] a) {
for (int i = a.length - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
if (a[j].getHeight() > a[j + 1].getHeight()) {
swap(a, j, j + 1);
}
}
}
}
/**
* 冒泡排序方法
*
* @param a
* 整数数组
*/
public static void bubbleSort(int[] a) {
for (int i = a.length - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
swap(a, j, j + 1);
}
}
}
}
/**
* 交换两个数据
*
* @param a
* 数组
* @param x
* 数组下标1
* @param y
* 数组下标2
*/
private static void swap(Cat[] a, int x, int y) {
// TODO Auto-generated method stub
Cat temp = a[x];
a[x] = a[y];
a[y] = temp;
}
/**
* 交换两个数据
*
* @param a
* 数组
* @param x
* 数组下标1
* @param y
* 数组下标2
*/
private static void swap(int[] a, int x, int y) {
// TODO Auto-generated method stub
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
/**
* 打印数组
*
* @param a
* Cat类型数组
*/
public static void print(Cat[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
/**
* 打印数组
*
* @param a
* int类型数组
*/
public static void print(int[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}
Test.java
/**
* 测试类
* @author jesson
*
*/
public class Test {
public static void main(String[] args) {
//int[] a = new int[]{9,8,2,4,5,6,7};
Cat[] a = {new Cat(5,5),new Cat(3,3),new Cat(1,1)};
DataSorter.print(a);
DataSorter.bubbleSort(a);
DataSorter.print(a);
}
}
这样,不仅可以对int类型的数组进行冒泡排序,还可以对Cat类型的数组进行排序。
现在问题又来了,需求变化,要实现对Dog类型的数组进行排序,该怎么办呢,当然了,还是可以用上面重载的方法,但是太麻烦了,如果以后又要对其他类型的数组进行排序,岂不是又要重载排序方法,所以,这种方法不可取。那么,如何用一个统一的排序方法,对所有类型的数组都能进行排序呢?答案是肯定的。
为了实现对所有的类都能进行排序,所以需要定义比较的规则,所以要比较的类首先是可以进行比较的,也就是这些待比较的所有类都有一个共同的特征,即可比较,因此,我们定义一个Comparable接口,让需要排序的类都实现这个接口,这样,我们再将DataSorter类中的排序方法中对Cat类进行排序的代码进行修改,类型定义为Object,这样,所有的类都可进行排序了,具体如下:
Comparable.java
/**
* 可比较接口
* 定义了一个比较方法
* @author jesson
*
*/
public interface Comparable {
public int compareTo(Object o);
}
Cat.java
/**
* Cat类 有属性身高,体重及toString()方法
*
* @author jesson
*
*/
public class Cat implements Comparable {
private int height; // 身高
private int weight; // 体重
public Cat(int height, int weight) {
// TODO Auto-generated constructor stub
this.height = height;
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
/**
* 重写toString()方法
*/
@Override
public String toString() {
return this.getHeight() + "|" + this.getWeight();
}
/**
* 实现Comparable接口的compareTO方法 返回1:当前的比参数中的对象大 返回-1:当前的比参数中的对象小 返回0:
* 当前的和参数中的对象相等
*/
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Cat cat = (Cat) o;
if (this.height > cat.getHeight())
return 1;
else if (this.height < cat.getHeight())
return -1;
else
return 0;
}
}
Dog.java
public class Dog implements Comparable {
private int food;
public Dog(int food) {
super();
// TODO Auto-generated constructor stub
this.food = food;
}
public int getFood() {
return food;
}
public void setFood(int food) {
this.food = food;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Dog dog = (Dog) o;
if (this.food > dog.getFood())
return 1;
else if (this.food < dog.getFood())
return -1;
else
return 0;
}
@Override
public String toString(){
return this.food + "";
}
}
DataSorter.java
/**
* 排序类
*
* @author jesson
*
*/
public class DataSorter {
/**
* 冒泡排序方法
*
* @param Cat类型数组
*/
public static void bubbleSort(Object[] a) {
for (int i = a.length - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
Comparable o1 = (Comparable)a[j];
Comparable o2 = (Comparable)a[j+1];
if (o1.compareTo(o2) == 1) {
swap(a, j, j + 1);
}
}
}
}
/**
* 冒泡排序方法
*
* @param a
* 整数数组
*/
public static void bubbleSort(int[] a) {
for (int i = a.length - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
swap(a, j, j + 1);
}
}
}
}
/**
* 交换两个数据
*
* @param a
* Object类型数组
* @param x
* 数组下标1
* @param y
* 数组下标2
*/
private static void swap(Object[] a, int x, int y) {
// TODO Auto-generated method stub
Object temp = a[x];
a[x] = a[y];
a[y] = temp;
}
/**
* 交换两个数据
*
* @param a
* 数组
* @param x
* 数组下标1
* @param y
* 数组下标2
*/
private static void swap(int[] a, int x, int y) {
// TODO Auto-generated method stub
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
/**
* 打印数组
*
* @param a
* Object类型数组
*/
public static void print(Object[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
/**
* 打印数组
*
* @param a
* int类型数组
*/
public static void print(int[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}
Test.java
/**
* 测试类
* @author jesson
*
*/
public class Test {
public static void main(String[] args) {
//int[] a = new int[]{9,8,2,4,5,6,7};
//Cat[] a = {new Cat(5,5),new Cat(3,3),new Cat(1,1)};
Dog[] a = {new Dog(3),new Dog(2),new Dog(6)};
DataSorter.print(a);
DataSorter.bubbleSort(a);
DataSorter.print(a);
}
}
这样修改之后,DataSorter不仅可以对Cat类型的数组进行排序,也可以对Dog类型的数组进行排序,而且,这时,如果需要对新定义的类也能进行排序的话,只要让其实现Comparable接口,并具体实现compareTo()方法,就可以不用再改动DataSorter类,就可以直接用DataSorter对新定义的类型的数组进行排序,达到了代码重用的目的。