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
好了,为了便于可读性和重用,我将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
我想用一个整数的方法打印一个螺旋矩阵。然而,我在纸上的代码运行得很好,但是当我运行时,我会得到不同的数字来代替我想要的数字。 在现实中,它应该打印如下内容 如果您能帮忙,我们将不胜感激。