繁体   English   中英

在 java 中对空数组和单词数组进行排序

[英]Sorting empty and word array in java

我想编写一个可以对 char 数组元素进行排序的代码。 但问题是我想在 'aa' 元素之前对 'a' 进行排序,但我不知道如何编写这部分。 它总是在 'a' 之前对 'aa' 进行排序。 起初它从用户那里得到输入,如果我们写'0'它会打印排序的数组。

    import java.util.Scanner;

public class First {
    public static void main(String[] args) {
        int i, num = 0;
        char[][] arr = new char[1000][1000];
        char[] index = new char[1000];
        Scanner myObj = new Scanner(System.in);
        for(i = 0; i < 1000; i++){
            arr[i] = myObj.next().toCharArray();
            if(arr[i][0] == '0'){
                break;
            }
            else{
                num++;
            }
            for(int j = 0; j < i; j++){
                if(arr[i][0] < arr[j][0]){
                    index = arr[i];
                    arr[i] = arr[j];
                    arr[j] = index;
                    j = 0;
                }
            }
        }
        for(i = 0; i < num; i++){
            System.out.println(arr[i]);
        }
    }
}

您必须考虑'aa'不是字符,而'a'是字符。 如果你想对字符串进行排序,代码几乎没问题。

这里有一个例子:

import java.util.Scanner;

public class First {

public static void main(String[] args) {
    int num = 0;
    String[] arr = new String[1000];
    String index = "";
    Scanner myObj = new Scanner(System.in);
    for(int i = 0; i < 1000; i++){
        arr[i] = myObj.nextLine();
        if(arr[i].equals("0")){
            break;
        }
        else{
            num++;
        }
        for(int j = 0; j < i; j++){
            if(arr[i].compareTo(arr[j]) < 0){
                index = arr[i];
                arr[i] = arr[j];
                arr[j] = index;
                j = 0;
            }
        }
    }

    System.out.print("[ ");
    for(int i = 0; i < num; i++){
        System.out.print(arr[i] + " ");
    }
    System.out.println("]");
   }
}

输入:

aaaaaaaa
aaaaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a
0

预计 Output:

[ a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa ]

它仅按输入单词的第一个字符排序。 因此,输入顺序似乎被保留了下来。

问题

添加一些调试打印显示 first-char a比较导致 case 之前不正确或不需要的aa

import java.util.Scanner;

public class First {
    public static void main(String[] args) {
        int i, num = 0;
        char[][] arr = new char[1000][1000];
        char[] index = new char[1000];
        Scanner myObj = new Scanner(System.in);
        for(i = 0; i < 1000; i++){
            arr[i] = myObj.next().toCharArray();
            if(arr[i][0] == '0'){
                break;
            }
            else{
                num++;
            }
            System.out.printf("Debug [%d]: '%s' \n", i, String.valueOf(arr[i]));
            for(int j = 0; j < i; j++){
                System.out.printf("Compare '%s' < '%s' = %s\n", arr[i][0], arr[j][0], (arr[i][0] < arr[j][0]));
                if(arr[i][0] < arr[j][0]){
                    index = arr[i];
                    arr[i] = arr[j];
                    arr[j] = index;
                    j = 0;
                }
            }
        }
        for(i = 0; i < num; i++){
            System.out.println(arr[i]);
        }
    }
}

Output:

a
Debug [0]: 'a' 
aa
Debug [1]: 'aa' 
Compare 'a' < 'a' = false
0
a
aa

重构并解决

我只是添加了一点 output 来与用户交互。 还重构了一点(提取到方法中,并使用可配置常量控制 arrays 的长度)。

import java.util.Scanner;

public class First {

    private static final int LENGTH = 10;
    private static final Scanner myObj = new Scanner(System.in);

    public static void main(String[] args) {
        char[][] arr = new char[LENGTH][LENGTH];
        System.out.println("Enter elements (each on a new line, 0 stops):");
        int num = readArray(0, arr);
        System.out.printf("Printing %d elements:\n", num);
        printArray(num, arr);
    }

    private static int readArray(int num, char[][] arr) {
        char[] index;
        int i;
        for (i = 0; i < LENGTH; i++) {
            arr[i] = readChars();
            if (arr[i][0] == '0') {
                break;
            } else {
                num++;
            }
            for (int j = 0; j < i; j++) {
                if (String.valueOf(arr[i]).compareTo(String.valueOf(arr[j])) < 0)  {  // entire array compared (chars in sequence) instead only: arr[i][0] < arr[j][0]
                    index = arr[i];
                    arr[i] = arr[j];
                    arr[j] = index;
                    j = 0;
                }
            }
        }
        return num;
    }

    private static void printArray(int num, char[][] arr) {
        int i;
        for (i = 0; i < num; i++) {
            System.out.println(arr[i]);
        }
    }

    private static char[] readChars() {
        return myObj.next().toCharArray();
    }
}

Output 符合预期( aaa之前):

Enter elements (each on a new line, 0 stops):
z
aa
b
a
0
Printing 4 elements:
a
aa
b
z

怎么运行的

比较整个数组(按顺序排列的字符),而不是只比较每个数组的第一个字符。

前:

  • arr[i][0] < arr[j][0]

后:

  • String.valueOf(arr[i]).compareTo(String.valueOf(arr[j])) < 0

额外提示:命名有助于发现逻辑错误

重命名方法和变量名时,程序的作用可能会更清楚一些,我们称之为语义

  • myObj 成为scanner
  • i 成为index或 wordIndex 或lineIndexlastLineIndex
  • j实际上是一个character-index...但是在这个简短的scope中它应该是不言而喻的
  • 字符数组可以是lines或词
  • num 成为行的lengthcountLines
  • 并且所有的方法名都在语义上进行了调整,以在行上进行操作,用名称<verb>Lines表示
import java.util.Scanner;

public class First {

    private static final int LENGTH = 10;
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        char[][] lines = new char[LENGTH][LENGTH];
        System.out.println("Enter elements (each on a new line, 0 stops):");
        int countLines = readLines(lines);
        System.out.printf("Printing %d elements:\n", countLines);
        printLines(lines, countLines);
    }

    private static int readLines(char[][] lines) {
        int linesRead = 0;

        for (int lineIndex = 0; lineIndex < LENGTH; lineIndex++) {
            lines[lineIndex] = readLine();
            if (lines[lineIndex][0] == '0') {
                break;
            } else {
                linesRead++;
            }
            sortLines(lines, lineIndex);
        }

        return linesRead;
    }

    private static void sortLines(char[][] lines, int lastLineIndex) {
        for (int j = 0; j < lastLineIndex; j++) {
            if (String.valueOf(lines[lastLineIndex]).compareTo(String.valueOf(lines[j])) < 0)  {  // entire array compared (chars in sequence) instead only: arr[i][0] < arr[j][0]
                char[] line = lines[lastLineIndex];
                lines[lastLineIndex] = lines[j];
                lines[j] = line;
                j = 0;
            }
        }
    }

    private static void printLines(char[][] lines, int length) {
        for (int i = 0; i < length; i++) {
            System.out.println(lines[i]);
        }
    }

    private static char[] readLine() {
        return scanner.next().toCharArray();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM