【问题标题】:Bubble sort array using methods使用方法的冒泡排序数组
【发布时间】:2021-06-14 11:47:44
【问题描述】:

我正在编写代码,输入数组长度和数组中的项目,然后使用冒泡排序方法将数组中的项目按顺序排列。

这是所需的输入输出

Enter the number of items in array:
5

Enter the items:
5
6
4
2
3

The sorted array is:
2
3
4
5
6

我遇到的问题是该方法似乎没有读取用户的输入。

这是我的代码

import java.util.Scanner;

public class Main {
    private static int[] array;
    public static void main(String[] args) {
        int arrayLength;
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the number of items in array: ");
        arrayLength = scanner.nextInt();
        int[] array = new int[10];
        System.out.println("Enter the items: ");
        for (int i = 0; i < arrayLength; i++) {
            array[i] = scanner.nextInt();
        }
        bubbleSort();
    }

    public static void bubbleSort() {
        int i, j, temp;
        boolean swap;
        for (i = 0; i < array.length - 1; i++) {
            swap = false;
            for (j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    swap = true;
                }
            }
            if (swap == false)
                break;
        }
        System.out.print("The sorted array is: ");
        for (i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
            System.out.println();
        }
    }
}

【问题讨论】:

    标签: java arrays loops methods bubble-sort


    【解决方案1】:

    将问题分解为更小的问题。这些小问题中的每一个都会成为一种方法。方法具有输入(参数)和输出(返回值)。查看您正在尝试做的事情的一种方法是:

    1. 读入数组
    2. 对数组进行排序
    3. 打印排序后的数组

    给定InputStream,第一种方法将返回int[]

    static int[] readArray(InputStream in) {
        System.out.print("Enter the number of items in array: ");
        Scanner scanner = new Scanner(in);
        int arrayLength = scanner.nextInt();
        int[] array = new int[arrayLength]; // there was a problem here, in your code the array had a fixed length of 10
    
        System.out.println("Enter the items: ");
        for (int i = 0; i < arrayLength; i++) {
            array[i] = scanner.nextInt();
        }
        return array;
    }
    

    在给定int[] 参数的情况下,第二种方法将返回使用冒泡排序算法排序的int[]

    static int[] bubbleSort(int[] array) {
        int i, j, temp;
        boolean swap;
        for (i = 0; i < array.length - 1; i++) {
            swap = false;
            for (j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    swap = true;
                }
            }
            if (!swap) {
                break;
            }
        }
        return array;
    }
    

    第三个将打印出来,什么也不返回 (void)。

    static void print(int[] array) {
        for (int i = 0; i < array.length; i++){
            System.out.println(array[i]);
        }
    }
    

    把碎片放在一起,你就有了

    public static void main(String[] args) {
        // get input from user
        int[] array = readArray(System.in);
        // sort it
        int[] sorted = bubbleSort(array);
        // print sorted array
        System.out.println("The sorted array is: ");
        print(sorted);
    }
    

    正如readArray(InputStream) 方法中的注释中所述,由于数组的长度是固定的 (10),因此您的原始代码存在问题。当使用只做一件事的简洁方法时,这些问题更容易被发现。通过将代码分解成更小的部分,也更容易对其进行测试。

    【讨论】:

      【解决方案2】:
      1. 请与您在名称和符号周围使用空格保持一致。它将使您的代码看起来好像是由关心的人编写的,而不是只是战略性地敲击键盘的人。这会本能地让人们对你和你的工作有更好的看法,这总是一件好事:)

      2. int[] array = new int[10]; 有问题。 10 是从哪里来的?永远不要在代码中使用幻数。即使是像 12 这样表示一年中的月数的数字,从技术上讲也是一个变量,可能会在一天内改变。将数字分配给命名变量,并改用名称。我会暗示这就是你困境的根源,但 saka1029 最先到达那里。

      3. 您在类的开头声明了一个名为数组的变量,然后在 main() 方法中定义了一个副本。用户输入被添加到 main() 中的数组中,但 bubbleSort() 使用的类变量永远不会添加任何内容。选项1:将数组声明为类变量并在每个方法中使用它。选项2:在main()中声明,然后在调用排序方法时作为参数传递,即bubbleSort(array)。我更喜欢后者,因为您对 bubbleSort 排序的内容更加清楚。

      4. 你的方法做的太多了,并且有不同层次的抽象,这对于新程序员来说是一个很常见的特性,所以不要为此感到难过。但是,一定要改进它! main() 既有获取信息的繁琐细节,又有一个方法调用,其中对数组进行排序的工作在其他地方处理。这是一个丑陋而令人困惑的组合。抽象数据收集,就像您已经为排序所做的那样,以使事情更加平衡。理想情况下,您的 main() 应该读起来像一个活动索引,这些活动都在其他方法中处理。至于方法做得太多,您的 bubbleSort() 对数组进行排序(好),但也会非常意外地打印它(坏)。方法名称并不表示数组被打印。我们试试吧

      public static void main(String[] args) {
          int[] array = getArray();
          bubbleSort(array);
          printArray(array);
      }
      

      修复从第 2 点和第 3 点渗入的错误。然后,您不必更改代码的逻辑,只需将其分解为更合乎逻辑的方法即可 :) 一旦您开始定期测试您的代码,这将是一个非常重要的方法。

      【讨论】:

        猜你喜欢
        • 2013-09-09
        • 2016-11-29
        • 2016-02-10
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多