首页 > 解决方案 > 我检查单词是否在一串字母中的方法永远不会返回true

问题描述

我正在尝试制作一个字轮求解器,它在 python 中正常工作,但我无法将它移植到 Java / Android。它不返回任何内容,也就是说,有效单词的结束集始终为空。

这些文件位于资产/字典中。

我可以将字典文件的每一行打印到日志中,没问题,但实际上检查它们是否包含某些可选和必需的字母是我卡住的地方。

字典文件按字母划分以节省时间。

java文件

 for(String letter : allLettersSet) {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(getAssets().open("dictionary/" + letter.toLowerCase() + ".txt")));
                Log.d("myTag", "opening " + "dictionary/" + letter.toLowerCase() + ".txt");
                String line;
                line = reader.readLine();
                while (line != null) {
//                    Log.d("myTag",line);
                    if(checkLetters(line.toUpperCase(), optionalLetters, requiredLetters)) {
                        validWordsList.add(line);
                    }else{
//                        Log.d("myTag", "Returned False...");
                    }
                }
                reader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        Log.d("myTag","Valid words are -> " + validWordsList);

    }


public boolean checkLetters(String word, ArrayList<String> optionalList, ArrayList<String> requiredList) {

        ArrayList<String> optionalListEditable = new ArrayList<>(optionalList);
        ArrayList<String> requiredListEditable = new ArrayList<>(requiredList);
        ArrayList<String> wordListEditable = new ArrayList<>(Arrays.asList(word));
        ArrayList<String> requiredListEditable2 = new ArrayList<>(requiredList);


        for(String letter : wordListEditable) {

            if (optionalListEditable.contains(letter)) {
                optionalListEditable.remove(letter);

            } else if (requiredListEditable.contains(letter)) {
                requiredListEditable.remove(letter);
            } else {
                return false;
            }
        }

        for(String letter : requiredListEditable2) {
            if (word.contains(letter)) {
                requiredListEditable2.remove(letter);
            }else {
                return false;
            }
        }

        return true;
    }

allLettersSet 只是此特定运行中所有字母的集合。用户提交的字母总是大写的,所以我将 bufferedReader 的每一行都设为大写,这样就不会有大小写问题。

该函数似乎总是返回 false。它永远不会返回 true,除非我翻转函数的目的以查看哪些单词不匹配。然后它将大约 50 个单词添加到数组 List 中并停止。我担心这可能是迭代过早停止,但日志显示它迭代了所有可能的字母文件。

标签: javaandroid

解决方案


推荐阅读