前面写的几个排序的算法都是对整形的数据进行排序,而我们在日常生活中要处理的东西并不全都是这些整形的数据,还有一些其他的东西,比如对一堆人按照姓氏的前后进行排序,或则是对一些产品按照出产的日期进行排序,等等等等,这些东西都不是我们做排序算法的时候用来做测试的数据类型,但是我们要知道一个理念,就是我们从书上或则是其他的地方知道的常用的排序的方法也就只有那么一些,我们要做的只是稍微改变一下,整形是数据类型,既然是类型,他能对类型进行排序,我们也可以用他来对其他的类型来进行排序,其他的类型当然就包括了我们自己定义的类。只要你规定好排序的要求就OK了。
今天要写的是一个基于前面写的一个插入排序,用它来对自己定义的Person类的对象按照其姓氏的前后顺序进行排序,毫无疑问,我们就要定义一个Person的类,里面当然要有“姓”的属性。还封装了一些其他的方法,包括打印Person对象的信息(displayInfo()),获得Person对象的“姓”(getLastName())代码如下。
package 对象排序;
public class Person {
/*
* lastName 姓
*/
private String lastName;
/*
* FirstName 名
*/
private String FirstName;
/*
* 年龄
*/
private int age;
/**
* 构造方法
* @param lastName 姓
* @param FirstName 名
* @param age 年龄
*/
public Person(String lastName,String FirstName,int age) {
this.lastName = lastName;
this.FirstName = FirstName;
this.age = age;
}
/*
* 打印人的信息
*/
public void displayInfo() {
System.out.print("Last Name: " + lastName);
System.out.print(" First Name: " + FirstName);
System.out.println(" age : "+ age);
}
/*
* 返回某人的姓
* @return 返回某人的姓
*/
public String getLastName() {
return lastName;
}
}
建好了自己定义的类,而且也说明了对象按照姓氏的前后顺序进行排列,下面我们就来完成它,在这里饿哦们调用了接口 Comparable<String> 中的 compareTo方法对姓氏的前后进行比较然后进行交换(比较和交换也就是所有排序算法的核心了),代码有详 细注释:
package 对象排序;
public class ObjectInsertSort {
/*
*定义一个“人”的数组
*/
private Person[] pers;
/*
*记录数组中当前的人数
*/
public static int number;
/*
* 构造函数初始化
*传入max函数,定义了数组的最大值
*/
public ObjectInsertSort(int max) {
pers = new Person[max];
number = 0;
}
/**
* 向数组中插入一个人的对象
* @param last 传入的姓
* @param first 传入的名
* @param age 传入的年龄
*/
public void insertPerson(String last,String first,int age) {
pers[number] = new Person(last,first,age);
number++;
}
/*
*打印出人数组的信息
*/
public void disPlayPInfo() {
for( int i = 0; i < number; i++){
pers[i].displayInfo(); // 调用人的打印的方法
}
}
/*
* 排序算法,基于插入排序,并且调用compareTo()方法对字符串的大小进行比较,
* 按照首字母A-Z,a-z越来越大,当首字母一样的时候依次往下进行。
* 若s2.compareTo(s1) > 0 则 s1>s2;
* 若s2.compareTo(s1) < 0则 s1<s2;
* 若s2.compareTo(s1) = 0则 s1=s2;
*/
public void objectInsertSort() {
int out,in;
for(out = 1; out < number; out++ ) {
Person temp = pers[out];
in = out;
while(in > 0 && pers[in-1].getLastName().compareTo(temp.getLastName())>0) {
pers[in] = pers[in-1];
--in;
}
pers[in] = temp;
}
}
public static void main(String[] args) {
ObjectInsertSort ois = new ObjectInsertSort(10);
ois.insertPerson("Harden", "James", 20);
ois.insertPerson("ben", "Laden", 30);
ois.insertPerson("Ben", "Laden", 30);
ois.insertPerson("Ban", "Laden", 30);
ois.insertPerson("Gaiz", "Bill",40);
ois.insertPerson("Bush", "Joe", 50);
System.out.println("当前的人数为:"+number);
System.out.println("没进行排序前:");
ois.disPlayPInfo();
System.out.println("排序后:");
ois.objectInsertSort();
ois.disPlayPInfo();
}
}
输入输出结果:
当前的人数为:6
没进行排序前:
Last Name: Harden First Name: James age : 20
Last Name: ben First Name: Laden age : 30
Last Name: Ben First Name: Laden age : 30
Last Name: Ban First Name: Laden age : 30
Last Name: Gaiz First Name: Bill age : 40
Last Name: Bush First Name: Joe age : 50
排序后:
Last Name: Ban First Name: Laden age : 30
Last Name: Ben First Name: Laden age : 30
Last Name: Bush First Name: Joe age : 50
Last Name: Gaiz First Name: Bill age : 40
Last Name: Harden First Name: James age : 20
Last Name: ben First Name: Laden age : 30
PS :就这样我们完成了对老外的姓氏按照字母表的前后顺序进行的排序,要做的只是多了一个我们自己定义的一个类,还有的就是我们自己给老外取得一些蛋疼的名字,来给我们测试(老外的姓和名是和我大天朝的姓和名恰好是相反的,前面是名,后面是姓,也就是上面的lastName(姓))。