【问题标题】:How to obtain a sentence with a specific word from an array list of sentences?如何从句子数组列表中获取具有特定单词的句子?
【发布时间】:2015-12-13 16:15:07
【问题描述】:

我正在构建一个 android/Java 程序,该程序从文本文件中读取数据并将文本文件中的每个句子存储在数组列表中。然后它检查每个句子中特定单词的出现并打印出包含该单词的句子。

这是我目前的代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.text4);
    text = (TextView)findViewById(R.id.info2);
    BufferedReader reader = null;

    try {
        reader = new BufferedReader(
                new InputStreamReader(getAssets().open("input3.txt")));

        String line;
        List<String> sentences = new ArrayList<String>();


        }

    }

}

从上面的代码可以看出,程序会寻找“尽管”这个词。

我的文本文件包含三个句子。如果我的文本文件使用以下结构排列(此结构在每个句子后都有一个换行符。

但是,如果文本文件按以下结构排列(每个句子后没有换行符),程序将在输出屏幕上输出所有三个句子。

我不想在文本文件中的每个句子之后添加换行符以使该程序正常工作。如何更改我的代码,使其适用于任何类型的文本文件,无论其结构如何?

【问题讨论】:

    标签: java android arrays string


    【解决方案1】:

    您的split() 根本不起作用。首先,您的表达式将只匹配这个确切的子字符串:

    .?!\r\n\t
    

    最后的额外标签也包含在匹配中。

    您可能打算使用字符类,例如[0-9],但是你忘了括号。

    既然line 正是文件中的一行文本,为什么要拆分\r\n?另外,为什么制表符 (\t) 被视为句子分隔符?

    split() 的下一部分是错误的,即您只取第一个值 ([0])。如果拆分成功,那将丢弃第二句和第三句。

    另外,在查找单词时,请确保不要匹配更长的单词,例如如果要查找is,则不要匹配this,因此您需要包括字边界检查(\b)。

    为了确保匹配的令牌,例如句号,包含在句子中,您需要使用零宽度正向后视非捕获组((?&lt;=X))。

    单词匹配也应该不区分大小写。

    最后,代码结构错误。由于缺少端括号 (}),因此无法编译。由于缩进不好,这更加令人困惑。

    这里是更新的代码:

    try (BufferedReader reader = new BufferedReader(
                                new InputStreamReader(getAssets().open("input3.txt")))) {
    
        List<String> sentences = new ArrayList<>();
        for (String line; (line = reader.readLine()) != null; ) {
            for (String sentence : line.split("(?<=[.?!\t])")) {
                sentence = sentence.trim();
                if (! sentence.isEmpty()) {
                    sentences.add(sentence);
                }
            }
        }
    
        Pattern word = Pattern.compile("\\bDESPITE\\b", Pattern.CASE_INSENSITIVE);
        for (String sentence : sentences) {
            if (word.matcher(sentence).find()) {
                text.setText(sentence);
                break; // No need to continue searching
            }
        }
    
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(), "Error reading file!", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
    

    【讨论】:

    • 非常感谢。它似乎有效,但仍然存在一个小问题。如果我用“some”代替“Despite”这样的词,它只会显示一个包含该词的句子。从我的文本文件中可以看出,第一句和第二句中都存在“some”这个词。我应该如何解决这个问题?
    • @user5665684 您的代码调用了text.setText(),因此只能分配一个值(句子)。当有不止一个时,你想要做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2018-09-27
    相关资源
    最近更新 更多