当前位置: 首页 > 知识库问答 >
问题:

这个打印矩阵的程序的错误在哪里?

颜嘉福
2023-03-14
import java.util.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class WordSearch {

public WordSearch() {

}

public void getMatrix() throws FileNotFoundException {



    File file = new File("/home/cameron/Desktop/words");

    ArrayList<String> words = new ArrayList<String>();

    String largest = "";

    char[][] data;

    int col = 0;




    Scanner sc = new Scanner(file);


    while (sc.hasNextLine()) {


        String first = sc.nextLine();

        words.add(first);


        if(first.length()>largest.length()){



         largest=first;

         col=largest.length();

        }
    }



        data = new char[col][col];

        int curWord=0;


        for(int i=0; i<words.size(); i++){
            String word=words.get(curWord);  
            int start=0;
            int row=0;
            int choice=0;
            int index=0;


         do
         {

           start = (int)(Math.random()*data.length);
           row =  (int)(Math.random()*data.length);
           choice = (int)(Math.random()*2);

         }
         while(start+word.length()>data.length);



         index=0;

         if(choice==0){
             for(int j=start; j<start+word.length(); j++){              
                 if(data[row][j]==0 || data[row][j]==word.charAt(index)){
                     data[row][j] = word.charAt(index);

                     index++;
                 }

                 else{ i=0; continue;}


             }
         }

         if(choice==1){
             for(int j=start; j<start+word.length(); j++){
                 if(data[j][row]==0 || data[j][row]==word.charAt(index)){
                    data[j][row] = word.charAt(index);

                    index++;
                 }

                 else{ i=0; continue;}
             }
         }

           curWord++;
          }



       for(int i=0; i<data.length; i++){
         for(int j=0; j<data[i].length; j++){
            if(data[i][j]==0)
             System.out.print("A ");
            else    
             System.out.print(data[i][j]+" ");
         }

         System.out.println();
        }


    }


 public static void main(String[] args) throws FileNotFoundException {



    WordSearch check = new WordSearch();

    check.getMatrix();

 }
}  

我设置了一个if else语句,用于如果单词的字符要打印在不同字符或单词的顶部,那么for循环(do while上方的循环)将重新启动,以确保单词被正确打印出来。

不过我有个问题。该程序似乎工作了大约50%,并打印出如下内容:

A A h A A A A f A 
A A a A A l A e A 
A A m A A a A n A 
A A b A A d A c A 
A A u A A y A e A 
A A r A A b A A A 
A A g A A u A A A 
A A e A A g A A A 
A A r A A A A A A 

偶尔我会得到这个错误,而且只是这个错误(在这个特定的索引处):

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at WordSearch.getMatrix(WordSearch.java:59)
at WordSearch.main(WordSearch.java:132)

编辑:以下是从文件中读入程序的内容:

ladybug
hamburger
fence

共有1个答案

谈旺
2023-03-14

好了,为了便于可读性和重用,我将for循环中的常见逻辑提取到一个方法中,对代码进行了一点清理。另外,else条件会给您带来一个问题,通过将“i”重置回0并导致偶尔的错误,这是不必要的。

请尝试这个修改的代码,让我知道如果你继续得到一个错误。在连续运行大约20次后,我不再看到问题:

    import java.util.*;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;

    public class WordSearch {
        ArrayList<String> words = new ArrayList<>();

        private void getMatrix(String filePath) throws FileNotFoundException {
            File file = new File(filePath);
            String largest = "";
            char[][] data;
            int col = 0;
            Scanner sc = new Scanner(file);

            while (sc.hasNextLine()) {
                String first = sc.nextLine();
                words.add(first);

                if(first.length() > largest.length()){
                    largest = first;
                    col = largest.length();
                }
            }

            data = new char[col][col];
            int curWord = 0;

            for(int i = 0; i < words.size(); i++){
                String word = words.get(curWord);
                int start = 0;
                int row = 0;
                int choice = 0;

                do{
                    start = (int)(Math.random()*data.length);
                    row =  (int)(Math.random()*data.length);
                    choice = (int)(Math.random()*2);
                }
                while(start + word.length() > data.length);

                updateData(choice, start, row, word, data);
                curWord++;
            }

            for (char[] aData : data) {
                for (char anAData : aData)
                    if (anAData == 0)
                        System.out.print("A ");
                    else
                        System.out.print(anAData + " ");
                System.out.println();
            }
        }

        private void updateData(int choice, int start, int row, String word, char[][] data){

            for(int index = 0, j = start; j < start + word.length(); j++){
                switch(choice){
                    case 0:
                        if(data[row][j] == 0 || data[row][j] == word.charAt(index)){
                            data[row][j] = word.charAt(index);
                            index++;
                        }
                        break;
                    case 1:
                        if(data[j][row] == 0 || data[j][row] == word.charAt(index)){
                            data[j][row] = word.charAt(index);
                            index++;
                        }
                        break;
                }
            }
        }

        private String getRandomLetter(){
            Random r = new Random();
            char c = (char) (r.nextInt(26) + 'a');
            return ("" + c).toUpperCase();
        }

        public static void main(String[] args) throws FileNotFoundException {
            WordSearch check = new WordSearch();
            check.getMatrix("/home/cameron/Desktop/words");
        }
    }  

程序很整洁,做得很好。为了让它更有趣一点,我添加/更改了一些东西,您可以根据自己的喜好使用或不使用这些东西。

words.add(first.toUpperCase());
K M D X H A L B H 
C M L G A W N F F 
M V W Z M D T O T 
L A D Y B U G T Y 
Y J U J U R D V C 
C I C O R P P I L 
B B P R G R Q L X 
D B D V E X R V K 
E I J H R G L D B 
 类似资料:
  • 问题内容: 这可能是一个简单的修复程序,但我只是没有看到它。我想弄清楚,如何从主体正确打印我的方法?我需要获取,设置和返回方法吗?另外,在课堂上我的while循环是否甚至必要? 该程序会编译并一直运行到无穷大,因此我猜while循环是错误的。但是它也仅在每行上连续打印。 扩展main的类是不相关的,并且是项目的一部分。抱歉,如果张贴错误,谢谢您的帮助。 整个程序的输出类似于: 树皮,树皮。 喵喵。

  • 本文向大家介绍螺旋打印矩阵,包括了螺旋打印矩阵的使用技巧和注意事项,需要的朋友参考一下 该算法用于以螺旋方式打印数组元素。首先,从第一行开始,先打印全部内容,然后按照最后一列打印,然后再最后一行,依此类推,从而以螺旋方式打印元素。  该算法的时间复杂度为O(MN),M为行数,N为列数。 输入输出 算法 输入: 矩阵矩阵,行和列m和n。 输出:以螺旋方式打印矩阵的元素。 示例 输出结果

  • 本文向大家介绍程序在python中以螺旋顺序打印矩阵元素,包括了程序在python中以螺旋顺序打印矩阵元素的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个2D矩阵垫。我们必须以螺旋方式打印矩阵元素。首先,从第一行(mat [0,0])开始,先打印整个内容,然后再打印最后一列,然后再打印最后一行,依此类推,从而以螺旋方式打印元素。 所以,如果输入像 7 10 9 2 9 1 6 2 3 9

  • 问题内容: 我得到以下代码: 这应该在从文件中逐字读取单词时进行大量计数。但是,当我最终尝试将数组打印到终端时,只需检查它是否还可以,然后再开始使程序能够将其写入文本文件,它只会给出一个错误,内容为:[Ljava。 lang.String; @ 163de20但是我不知道在这种情况下如何以及在哪里检查错误?有什么帮助吗? 问题答案: 这不是错误…这是Object类的默认toString()实现返回

  • NowCoder 题目描述 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 解题思路 // java public ArrayList printMatrix(int[][] matrix) { ArrayList ret = new ArrayList<>(); int r1 = 0, r2

  • 我想用一个整数的方法打印一个螺旋矩阵。然而,我在纸上的代码运行得很好,但是当我运行时,我会得到不同的数字来代替我想要的数字。 在现实中,它应该打印如下内容 如果您能帮忙,我们将不胜感激。