PTA面向对象的程序设计(集合题型)

7-1 多数组排序

分数 10

作者 温彦

单位 山东科技大学

3个整数数组进行整体排序,根据输入的三个数组的元素,输出排序后的结果(从大到小)

输入格式:

第1个数组的长度

第1个数组的各个元素

第2个数组的长度

第2个数组的各个元素

第3个数组的长度

第3个数组的各个元素

输出格式:

所有数组的整体排序

代码如下:

import java.util.*;

public class Main {
    public static void main(String[] args) {
      
        /*
         * 思路分析:
         * 1.经分析使用ArrayList集合更好
         * 2.用数组接收输入的数据,然后存放到ArrayList集合当中
         * 2.2 因为有三组数据 我为了避免重复劳动,使用同一个数组
         *     连续接收三次,所以在外层又套了一个接收三次的循环
         * 3.里层的for循环既接收了输入的数组,又把输入的数据放在List集合当中
         * 4.调用ArrayList的排序方法sort方法完成对集合的排序
         * */
        ArrayList list = new ArrayList();
        Scanner scanner = new Scanner(System.in);
        //由题可知只有三个数组,flag用来控制三个数组的输入
        int flag = 1;
        while (flag <= 3) {
            int a = scanner.nextInt();
            int[] arr = new int[a];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = scanner.nextInt();
                list.add(arr[i]);
            }
            //为了跳出循环
            flag++;
        }
        //默认是升序排列,但是题目要求是降序,其实应该直接排序(划掉)
        //运用了sort的定制排序,打开sort源码
        // 我对i1-i2 是从小到大排序 i2 - i1 是从大到小排序的理解:
        // 首先 因为在 if 里面我们判断 是交换的条件是 传入参数之后的返回值大于0
        // 使用 i1 - i2 的本质就是 i1与i2的值大的挪到小的后面
        // (i1-i2) i1对应的就是arr[0] i2对应的
        // 就是arr[1] 在第一次比较中.
        // 这就相当于 第一个值 如果 大于第二个值 就将第一个值和第二个值交换顺序)
        //i2 - i1 的本质就是 值小的挪到值大的后面
        // (i2 - i1则是相当于如果第二个大于第一个就交换arr[0]和
        // arr[1]的值)
        //总而言之,记住就行 i1-i2是升序,i2-i1是降序
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int i1 = (Integer) o1;
                int i2 = (Integer) o2;
                return i2 - i1;
            }
        });
        //为了满足变态的输出格式,烦死我!!!!!!!!
        int temp = 0;
        for (Object o : list) {

            System.out.print(o);
            temp++;
            if (temp < list.size())
                System.out.print(" ");
        }
    }
}

思路是调用Connections实现类的的sort方法将list集合进行排序,它默认的排序方法是升序(即从小到大)运用定制排序的方法(解释定制排序原理代码如下:)

import java.util.Comparator;

public class Math01 {
    public static void main(String[] args) {
        //20  0   8   1  -1
        int[] arr = {-1, 1, 8, 0, 20};
//bubble01(arr);
        bubble02(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int i1 = (Integer) o1;
                int i2 = (Integer) o2;
                //此处决定着是从到大小排序还是从小到大排序
                //举例:下面的控制条件是 >0 执行交换 按照
                // 第一次:i1-i2 i1->arr[0] i2->arr[1]
                //1-(-1) = 2 > 0 所以 进行交换
                // 通过 for 的内层循环 实现comper的传进的实参更新
                //我对 为什么 i1-i2 是从小到大排序 i2 - i1 是从大到小排序的理解:
                // 首先 因为在 if 里面我们判断 是交换的条件是 传入参数之后的返回值大于0
                // 使用 i1 - i2 的本质就是 i1与i2的值大的挪到小的后面(i1-i2 i1对应的就是arr[0] i2对应的
                // 就是arr[1] 在第一次比较中。 这就相当于 第一个值 如果 大于第二个值 就将第一个值和第二个值交换顺序)
                //i2 - i1 的本质就是 值小的挪到值大的后面(i2 - i1则是相当于如果第二个大于第一个就交换arr[0]和
                // arr[1]的值)
                //
                return i1 - i2;// return i2 - i1;
            }
        });
        System.out.println("==定制排序后的情况==");
        System.out.println(Arrays.toString(arr));
    }

    //结合冒泡 + 定制
    public static void bubble02(int[] arr, Comparator c) {
        int temp = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
//数组排序由 c.compare(arr[j], arr[j + 1])返回的值决定
                if (c.compare(arr[j], arr[j + 1]) > 0) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

解决了本题,如有错误还请指正(萌新一枚,轻喷)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
矩阵是一个二维数组,在程序中可以使用整型数组来表示。下面是一个利用二维数组实现矩阵类的示例代码: ```java public class Matrix { private int[][] matrix; private int rows; private int cols; public Matrix(int rows, int cols) { this.rows = rows; this.cols = cols; matrix = new int[rows][cols]; } public int getRows() { return rows; } public int getCols() { return cols; } public int getElement(int i, int j) { return matrix[i][j]; } public void setElement(int i, int j, int value) { matrix[i][j] = value; } public void printMatrix() { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } } } ``` 在上述代码中,我们定义了一个矩阵类`Matrix`,其中包含了矩阵的行数、列数和一个二维整型数组`matrix`来存储矩阵的元素。 通过构造函数`Matrix(int rows, int cols)`,可以创建一个指定行数和列数的矩阵对象。我们还定义了`getRows()`和`getCols()`方法来获取矩阵的行数和列数。 为了访问和修改矩阵的元素,我们使用`getElement(int i, int j)`和`setElement(int i, int j, int value)`方法。 最后,我们提供了一个`printMatrix()`方法,用于打印矩阵的元素。 使用该矩阵类,我们可以创建一个矩阵对象,设置和获取矩阵的元素,并打印矩阵的内容。例如: ```java public class Main { public static void main(String[] args) { Matrix matrix = new Matrix(3, 3); matrix.setElement(0, 0, 1); matrix.setElement(0, 1, 2); matrix.setElement(0, 2, 3); matrix.setElement(1, 0, 4); matrix.setElement(1, 1, 5); matrix.setElement(1, 2, 6); matrix.setElement(2, 0, 7); matrix.setElement(2, 1, 8); matrix.setElement(2, 2, 9); matrix.printMatrix(); } } ``` 上述代码定义了一个3×3的矩阵对象,设置了矩阵的元素,并通过`printMatrix()`方法打印出了矩阵的内容。 输出结果为: ``` 1 2 3 4 5 6 7 8 9 ``` 这样就实现了一个利用二维数组实现矩阵类的简单例子。当然,这只是一个基本的实现,还可以根据需求扩展矩阵类的功能,例如加法、乘法等矩阵运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值