Java语言中对象数组排序实验

Java语言中对象数组排序实验

一、实验目的:

1、掌握对象数组的声明格式;
2、了解数组在内存中的存储;
3、掌握String类的compareTo()方法的应用;
4、掌握实现Comparable接口的compareTo()方法的实现;
5、掌握用Arrays.sort()通过实现Comparator接口的compare()方法,进行对象数组进行排序;
6、掌握重写Object类的toString()方法来修改Arrays类中toString()方法输出数组的格式。

二、实验内容:

截止2017年,世界GDP前10名的国家如下:

国家GDP(亿美元)国土面积(万平方公里)大洲
America195558.74983.0America
China131735.85956.0Asia
Japan43421.6037.8Asia
Germany35954.0635.74Europe
Britain32322.8124.36Europe
India26074.09329.0Asia
France25865.6854.91Europe
Italy19329.8330.13Europe
Brazil17592.67852.0America
Canada16823.68998.0America

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()方法,才能实现对象的格式输出

运行结果

在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值