Java语言中对象数组排序实验
一、实验目的:
1、掌握对象数组的声明格式;
2、了解数组在内存中的存储;
3、掌握String类的compareTo()方法的应用;
4、掌握实现Comparable接口的compareTo()方法的实现;
5、掌握用Arrays.sort()通过实现Comparator接口的compare()方法,进行对象数组进行排序;
6、掌握重写Object类的toString()方法来修改Arrays类中toString()方法输出数组的格式。
二、实验内容:
截止2017年,世界GDP前10名的国家如下:
国家 | GDP(亿美元) | 国土面积(万平方公里) | 大洲 |
---|---|---|---|
America | 195558.74 | 983.0 | America |
China | 131735.85 | 956.0 | Asia |
Japan | 43421.60 | 37.8 | Asia |
Germany | 35954.06 | 35.74 | Europe |
Britain | 32322.81 | 24.36 | Europe |
India | 26074.09 | 329.0 | Asia |
France | 25865.68 | 54.91 | Europe |
Italy | 19329.83 | 30.13 | Europe |
Brazil | 17592.67 | 852.0 | America |
Canada | 16823.68 | 998.0 | America |
1、请创建一个国家类Nation。
(1)成员变量包括:
国家名称:String name
国内生产总值(亿美元):float GDP
国土面积(万平方公里):float landArea
属哪个大洲:String continent
String name;
float GDP;
float landArea;
String continent;
(2)构造方法:实现对所有成员变量初始化;
public Nation(String name, float GDP, float landArea, String continent) { // 包含三个参数的构造方法
this.name = name;
this.GDP = GDP;
this.landArea = landArea;
this.continent = continent;
}
(3)实现Comparable接口的compareTo()方法,实现:首先按照大洲排序,“大洲”相同按照GDP降序排序。
continent 是默认升序的
@Override
public int compareTo(Object o) { // 实现Comparable接口的compareTo()方法
Nation nation = (Nation) o;
int res;
res = this.continent.compareTo(nation.continent); // 先按大陆名字排序
if (res == 0) {
res = (this.GDP < nation.GDP ? 1 : (this.GDP == nation.GDP ? 0 : -1)); // 然后再按GDP大小降序排序
}
return res;
}
(4)重写Object类的toString()方法,按照格式“国家名称,大洲,GDP,国土面积”输出。注:请同学阅读API文档中在java.lang包中的String类,详细研究其format()方法,在网络上查找String.format()方法的应用案例。如果能够在GDP和国土面积2列输出时,调用String.format()方法,可以实现对数值型数据的格式输出,使得输出数据更加整齐,见图2。
@Override
public String toString() { // 重写toString()方法
return "\n"+continent+"\t"+name+"\t"+String.format("%.2f",GDP)+"\t"+String.format("%.2f",landArea);
}
2、创建一个Top10的类。
在其main()方法中:
创建一个Nation类的对象数组nationTop10;
Nation []nationTop10 = new Nation[]{ // 静态声明一个数组,包含十个国家的数组
new Nation("America",195558.74f,983.0f,"America"),
new Nation("China",131735.85f,956.0f,"Asia"),
new Nation("Japan",43421.60f,37.8f,"Asia"),
new Nation("Germany",35954.06f,35.74f,"Europe"),
new Nation("Britain",32322.81f,24.36f,"Europe"),
new Nation("India",26074.09f,329.0f,"Asia"),
new Nation("France",25865.68f,54.91f,"Europe"),
new Nation("Italy",19329.83f,30.13f,"Europe"),
new Nation("Brazil",17592.67f,852.0f,"America"),
new Nation("Canada",16823.68f,998.0f,"America")
};
(1)调用Arrays.sort()方法,对数组nationTop10进行排序;
Arrays.sort() 方法没有返回值,意味着,这个方法直接改变原值
System.out.println("TOP10中,各大洲按GDP排序:");
Arrays.sort(nationTop10); // 调用重写后的compareTo()方法,进行排序
调用Arrays.toString()方法输出排序后的nationTop10数组;
System.out.println(Arrays.toString(nationTop10)); // 调用toString()方法输出
(2)调用Arrays.sort()方法:在方法中,采用匿名类方式实现Comparator接口中的compare()抽象方法,实现:先按“大洲”排序、然后按照国土面积大小降序排序,实现对nationTop10重新排序;
Arrays.sort(nationTop10, new Comparator<Nation>() { // 重写Arrays.sort()方法,采用匿名类方式实现Comparator接口中的compare()抽象方法
@Override
public int compare(Nation n1, Nation n2) { // 实现对nationTop10重新排序
int res;
res = n1.continent.compareTo(n2.continent); // 先按“大洲”排序
if (res == 0){
res = n1.landArea < n2.landArea ? 1 : (n1.landArea == n2.landArea ? 0 : -1); // 然后按照国土面积大小降序排序
}
return res;
}
});
调用Arrays.toString()方法输出重新排序后的nationTop10数组;
System.out.println("Top10中,各大洲按国土面积排序:");
System.out.println(Arrays.toString(nationTop10)); // 调用toString()方法输出
三、注意:
在对字符串类型进行排序时,需要用到String类型提供的compareTo()方法。
上述对“大洲”排序和GDP或国土面积排序时,只有当“大洲”相同的情况下,才需要进行GDP或者国土面积降序排序。
四、要求:
1、调用Arrays.toString()方法输出如下格式数组:
格式一,见图1;或者格式二,见图2。
2、给出详细源代码;
package experiment15.java;
import java.util.Arrays;
import java.util.Comparator;
public class Nation implements Comparable { // 继承Comparable接口
String name;
float GDP;
float landArea;
String continent;
public Nation(String name, float GDP, float landArea, String continent) { // 包含三个参数的构造方法
this.name = name;
this.GDP = GDP;
this.landArea = landArea;
this.continent = continent;
}
@Override
public int compareTo(Object o) { // 实现Comparable接口的compareTo()方法
Nation nation = (Nation) o;
int res;
res = this.continent.compareTo(nation.continent); // 先按大陆名字排序
if (res == 0) {
res = (this.GDP < nation.GDP ? 1 : (this.GDP == nation.GDP ? 0 : -1)); // 然后再按GDP大小降序排序
}
return res;
}
@Override
public String toString() { // 重写toString()方法
return "\n"+continent+"\t"+name+"\t"+String.format("%.2f",GDP)+"\t"+String.format("%.2f",landArea);
}
}
class Top10{
public static void main(String []args){
Nation []nationTop10 = new Nation[]{ // 静态声明一个数组,包含十个国家的数组
new Nation("America",195558.74f,983.0f,"America"),
new Nation("China",131735.85f,956.0f,"Asia"),
new Nation("Japan",43421.60f,37.8f,"Asia"),
new Nation("Germany",35954.06f,35.74f,"Europe"),
new Nation("Britain",32322.81f,24.36f,"Europe"),
new Nation("India",26074.09f,329.0f,"Asia"),
new Nation("France",25865.68f,54.91f,"Europe"),
new Nation("Italy",19329.83f,30.13f,"Europe"),
new Nation("Brazil",17592.67f,852.0f,"America"),
new Nation("Canada",16823.68f,998.0f,"America")
};
System.out.println("TOP10中,各大洲按GDP排序:");
Arrays.sort(nationTop10); // 调用重写后的compareTo()方法,进行排序
System.out.println(Arrays.toString(nationTop10)); // 调用toString()方法输出
System.out.println("");
Arrays.sort(nationTop10, new Comparator<Nation>() { // 重写Arrays.sort()方法,采用匿名类方式实现Comparator接口中的compare()抽象方法
@Override
public int compare(Nation n1, Nation n2) { // 实现对nationTop10重新排序
int res;
res = n1.continent.compareTo(n2.continent); // 先按“大洲”排序
if (res == 0){
res = n1.landArea < n2.landArea ? 1 : (n1.landArea == n2.landArea ? 0 : -1); // 然后按照国土面积大小降序排序
}
return res;
}
});
System.out.println("Top10中,各大洲按国土面积排序:");
System.out.println(Arrays.toString(nationTop10)); // 调用toString()方法输出
}
}
3、在源代码中说明nationTop10的声明方式是静态声明方式、还是动态声明方式。
Nation []nationTop10 = new Nation[]{ // 静态声明一个数组,包含十个国家的数组
new Nation("America",195558.74f,983.0f,"America"),
new Nation("China",131735.85f,956.0f,"Asia"),
new Nation("Japan",43421.60f,37.8f,"Asia"),
new Nation("Germany",35954.06f,35.74f,"Europe"),
new Nation("Britain",32322.81f,24.36f,"Europe"),
new Nation("India",26074.09f,329.0f,"Asia"),
new Nation("France",25865.68f,54.91f,"Europe"),
new Nation("Italy",19329.83f,30.13f,"Europe"),
new Nation("Brazil",17592.67f,852.0f,"America"),
new Nation("Canada",16823.68f,998.0f,"America")
};
4、dir显示当前目录的内容,截屏作为实验报告的最后内容。
如果不太理解的话,可以查看我之前写的文章关于《在IDEA使用控制台,显示文件》
链接: 《在IDEA使用控制台,显示文件》
五、思考:
1、为什么在Nation类中,实现Comparable接口的compareTo()方法,在Arrays.sort()方法,可以实现按照要求进行对象数组排序?
我们写的sort()中的对象的类型是自定义类型,所以必须实现了接口中的方法,因为在排序时,会用到compareTo() 方法
2、为什么在Nation类中,重写了Object类的toString()方法,可以在Arrays.toString()方法输出对象数组时,实现对象的格式输出?
因为我们toString()中的对象的类型是自定义类型的,所以必须重写toString()方法,才能实现对象的格式输出