【问题标题】:How do I compare a a string array with a char array如何将字符串数组与 char 数组进行比较
【发布时间】:2013-10-01 14:39:46
【问题描述】:

我很绝望,我需要你的帮助!我正在研究一个填字游戏求解器,其中给出了谜题和单词,我们需要格式化谜题,以便数组中的每个索引都有自己的字母。现在我有拼图索引拆分和单词拆分所以我可以进去逐个字母比较它们但是有更好的方法吗?比方说,是否有可能有一个包含我要查找的单词的字符串数组,并有一个字符数组来定位该单词?

    My array looks like this: 
    [W, V, E, R, T, I, C, A, L, L]
    [R, O, O, A, F, F, L, S, A, B]
    [A, C, R, I, L, I, A, T, O, A]
    [N, D, O, D, K, O, N, W, D, C]
    [D, R, K, E, S, O, O, D, D, K]
    [O, E, E, P, Z, E, G, L, I, W]
    [M, S, I, I, H, O, A, E, R, A]
    [A, L, R, K, R, R, I, R, E, R]
    [K, O, D, I, D, E, D, R, C, D]
    [H, E, L, W, S, L, E, U, T, H]

假设我正在寻找“垂直”。如何设置一个循环来查找组成字符串“垂直”的字符。还是必须逐字比较?

这是我的代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class WordSearch {

    public static void main(String[] args) throws Exception{
            File file = new File("puzzle.txt"); 
            Scanner sc = new Scanner(file);
        int row = sc.nextInt();
        int col = sc.nextInt();
        sc.nextLine();

        //Make an array to hold the puzzle
        char[][] puzzle = new char[row][col];   


         //Read in the strings from the file into the array.
        for (int i=0; i<row; i++){
            String getChar = (new String(sc.next()));
            for(int j = 0;j<col; j++){
                puzzle[i][j] = getChar.charAt(j);
                }
            }

        //Test Print
         for (int i=0; i<puzzle.length; i++){

               System.out.print(Arrays.toString(puzzle[i]));
               System.out.println("");
         }



        //Read the number of words and move to the next line    
        int numwords = sc.nextInt();
        sc.nextLine();

        //Make an array to hold the words and read in the words from a file
        String[] words = new String[numwords];
        for(int i=0; i<numwords; i++){
            words[i] = sc.nextLine();
        }

        //look for each word
        for(int i=0; i<numwords; i++){
            String currentword = words[i];      

            String[] strings1 = currentword.split("");

            int range = currentword.length()+1;

            String[] strings2 = Arrays.copyOfRange(strings1, 1, range);

            int range2 = strings2.length;
            char[] charwords = new char[range2];    





            }



    //Close the scanner     
    sc.close();
    }

    }

这是否可以测试对角线:

private boolean checkDiagonals(int row, int col, String word, char[][] puzzle) {
        //Checking diagonals direction
        for(int letter = 1; letter < word.length(); letter++) {
            if(puzzle[row + letter][col + letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row + letter][col - letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row - letter][col - letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row - letter][col + letter] != word.charAt(letter)) {
                return false;
            }
        }
        return true;
    }

【问题讨论】:

  • 单词是水平的、对角的还是垂直的?
  • 是的,它们在所有主要方向上。或者老师说的。
  • 您将不得不编写执行搜索的代码。如果您正在搜索特定单词,请查找起始字母,然后检查每个方向以查看您是否可以完成单词
  • 它们可以倒序(从右到左)吗?
  • @JohnB 是的,它们可以反过来。

标签: java arrays string char


【解决方案1】:

因为单词可以指向任何方向,所以简单地逐个字母会更有意义。在整个字符数组中搜索您要查找的单词的第一个字母。例如,如果您正在寻找“VERTICAL”,您将遍历整个数组以寻找字母“V”。

然后有一个函数可以验证所有方向(上、下、左、右、对角线)的单词。我们称之为check(int row, int col)

for(int row = 0; row < puzzle.length; row++) {
    for(int col = 0; col < puzzle[0].length; col++) {
        if(puzzle[row][col] == word.charAt(0))
            if(check(row, col) == true)
                    //We found it.
    }
}

然后写check(int row, int col, String word, char[][] puzzle),你会检查每个基本方向,例如,如果你检查正确,你会继续向右,将字母与单词进行比较,直到匹配单词,或者发现不一致.然后如果没有方向有效,则返回false。

作为一个例子,这里是右边的检查(在我们不在数组的情况下没有错误检查,你想要实现它)。

private boolean checkRight(int row, int col, String word, char[][] puzzle) {
    //Checking right direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row][col + letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}

然后,您需要为每个方向使用其中一个,然后在您的检查功能中,它看起来像

public boolean check(int row, int col, String word, char[][] puzzle) {
    if(checkRight(row, col, word, puzzle)) return true;
    if(checkLeft(row, col, word, puzzle)) return true;
    if(checkUp(row, col, word, puzzle)) return true;
    if(checkDown(row, col, word, puzzle)) return true;
    if(checkDiagonals(row, col, word, puzzle)) return true;
    return false;
}

【讨论】:

  • 谢谢!现在它只是说方法 check(int,int) 是未定义的。会尝试定义它。
  • 所以我会写一个函数,将 1 添加到 [col] 直到匹配,然后继续将 1 添加到 [col] 直到找到所有字符/到达行尾,然后添加 1 [row] 并继续拼图?
  • 我对在 check 方法中如何处理 row 和 col 感到困惑。
  • 所以,传入方法的row和col就是第一个字母的位置。然后,您需要检查基本方向(左、右、上、下、对角线)。所以对于左边,你只需从列中减去 1 并将下一个字母与单词中的下一个字母进行比较。然后对于正确的,您将在 col 中添加一个并比较字母。但是每次切换方向时,您都希望从初始位置开始。
  • 很抱歉,我是java中的超级菜鸟。 check 方法返回 true 或 false 但我不知道如何让它移动位置。我可以在 check 方法中添加或减去 row 和 col ,但这将如何返回 true 或 false。我需要在 check 方法中添加另一个if(puzzle[row][col] == word.charAt(0) 吗?
【解决方案2】:

比方说,是否有可能有一个包含我要查找的单词的字符串数组,并有一个字符数组来定位该单词?

是的,只需这样做

从字符串数组中获取元素,如

  String arrayElem = str[i]; // i is index.

给你一个字符串。

然后

  boolean result=Arrays.equals(arrayElem.toCharArray(), actualCharArray);

【讨论】:

  • 我现在唯一的问题是我的字符数组是一个二维数组,而 .equals 只允许 char[] char[]。
【解决方案3】:

我建议将数组中的每一行转换为String,然后使用String.indexOf()。这将确定您要查找的字符串是否存在于行中以及它开始的位置。如果您返回-1,则您知道该字符串在该行中不存在。

String.indexOf()

【讨论】:

  • 这不会涉及对角线。
  • 是的,关于这个的评论是在我发布答案后发布的。我想我仍然会创建Strings 来表示所有方向(水平、垂直、左上角到右下角、右上角到左下角)。您也可以保留您要查找的单词,以查找它是否存在于相反的方向。
  • 它也不会处理垂直词。 Java 没有我知道的从二维数组中提取列的方法,而且我在快速浏览 Apache Commons 的ArrayUtils 时也没有看到。也许某处的某个库包中有一个。
  • 没有暗示有一个内置机制可以这样做,但编写一个在垂直/对角方向循环数组的方法很容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多