2D 阵列打印不稳定的输出



我这里的测试程序应该采用一个 1D 数组并将其分类为 2D 数组。

该文件是从"a"到"z"的 3000 个常用单词。设置似乎正确,我什至得到了一个开始正确的输出。但是,在以"b"开头的单词之后,我只得到空值。

public static void main(String[] args) throws FileNotFoundException {
    int listSize = 0;
    File file = new File("3000-Common-Words.txt");
    Initialize a = new Initialize();
    String[] oneArray = a.Initialization(file);
    for (int i = 0; i < 26; i++) {
        int sizeCheck = 0;
        for (int j = 0; j < 3000; j++) {
            if (oneArray[j].charAt(0) == (char) (i + 97)) {
                sizeCheck++;
            }
            if (sizeCheck > listSize) {
                listSize = sizeCheck;
            }
        }
    }
    String[][] twoArray = new String[26][listSize];
    for (int i = 0; i < 26; i++) {
        for (int j = 0; j < listSize; j++) {
            if (oneArray[j].charAt(0)==(char)(i+97)){
                twoArray[i][j]=oneArray[j];
            }
        }
    }
    for (int i = 0; i < 26; i++) {
        for (int j = 0; j < listSize; j++) {
            System.out.println(twoArray[i][j]);
        }
    }
}

第一个数组的初始化是正确的(我已经检查了输出(。

我明白为什么我的数组在"c"之前停止。这是因为我有oneArray[j]但我仍然坚持如何填充数组......

任何帮助不胜感激!

填充数组的逻辑略有缺陷。您已经正确计算出稀疏矩阵的最小维度。在字母表的任何字母中,最多单词数将是 26。但是,您尚未选择独立的迭代计数器来读取单词列表和填充数组。

这是一个可行的解决方案:

public class WordSort {
    public static void main(String[] args) {
        int listSize = 0;
        String[] oneArray = {"a1","b1","c1","d1","e1","f1","g1","h1","i1","j1","k1","l1","m1","n1","o1","p1","q1","r1","s1","t1","u1","v1","w1","x1","y1","z1","a2","b2","d2","g2","n2","l2","z2","v2","g3","h3","p0","h9","r5","t3","o9","l7","h6","f5","q5",};
        for (int i = 0; i < 26; i++) {
            int sizeCheck = 0;
            for (int j = 0; j < oneArray.length; j++) {
                if (oneArray[j].charAt(0) == (char) (i + 97)) {
                    sizeCheck++;
                }
                if (sizeCheck > listSize) {
                    listSize = sizeCheck;
                }
            }
        }
        String[][] twoArray = new String[26][listSize];
        for (int i = 0; i < 26; i++) {
            int k = 0;
            for (int j = 0; j < oneArray.length; j++) {
                if (oneArray[j].charAt(0)==(char)(i+97)){
                    twoArray[i][k++]=oneArray[j];
                }
            }
        }
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < listSize; j++) {
                System.out.println(twoArray[i][j]);
            }
        }
    }
}

sizeCheck 将以字母开头的单词数。列表大小将是其中的最大值。但是在您的第二个循环中

for (int j = 0; j < listSize; j++) {
        if (oneArray[j].charAt(0)==(char)(i+97)){
            twoArray[i][j]=oneArray[j];
        }
    }

您始终只"扫描"第一个数组中的第一个"listSize"字数,实际上长度为 3000 个单词。所以不要使用 j 来迭代 "oneArray",而是使用另一个变量。