【问题标题】:Get rid of duplicate Strings in Java摆脱Java中的重复字符串
【发布时间】:2015-03-03 14:52:44
【问题描述】:

我有一个字符串数组:

String[] array = {"the","juice"};

和另一个带有一些文本的字符串:

String text = "the juice we had yesterday was great!";

和一个函数,它基本上检查数组中的单词是否存在于文本中,如果存在则打印字符串。

这很简单,但是我在输出中得到了重复的行,因为 for 循环一次检查一个单词。由于两者都存在于字符串中,文本将被打印两次。

这是我的代码,用于说明目的:

public void filter (String[] words, String text){

    for(int i = 0; i < words.length; i++){

          if(text.toLowerCase().contains(words[i].toLowerCase()))

              System.out.println(text);

        }

}

我该如何解决这个问题?

正确的输出应该是一行的打印。

更新:

考虑读取一个文本文件,而不仅仅是一个字符串:

public void filter (String[] words, BufferedReader text){

    String line = text.readLine();

    for(int i = 0; i < words.length; i++){

          if(line.toLowerCase().contains(words[i].toLowerCase()))

              System.out.println(text);

        }
    line = text.readLine();
}

【问题讨论】:

  • 当第一次出现时你不考虑简单的return吗?
  • 是否仅当数组中的所有单词都存在于字符串中或找到任何单词时才打印?
  • 不够清楚。您是否只想在数组中的所有单词都出现在您的文本中时才打印?或者找到匹配项后打印?
  • @Andremoniy 是的,但是对于多行文本,例如,来自一个不起作用的文件
  • @laker001 哦,真的吗?我不信,找你逻辑错误

标签: java filter


【解决方案1】:

根据问题更改编辑答案

遍历reader中的每一行

遍历 words 数组以查找 any 匹配

如果匹配打印文本

转到reader 中的下一行

public void filter(String[] words, BufferedReader reader) throws IOException {

    String text;
    while ((text = reader.readLine()) != null) {
        for (int i = 0; i < words.length; i++) {
            if (text.toLowerCase().contains(words[i].toLowerCase())) {
                //Anytime I'm able to find something ono the array print it out
                System.out.println(text);
                //move on to the next line in the reader
                break;
            }
        }
    }
}

【讨论】:

  • 现在可以使用了!但我没有换行,而是放 text = reader.readLine();
  • @laker001 我不建议添加额外的 reader.readLine()... while 循环将负责逐行读取。 break 是为了避免在 for 循环中继续检查单词。
【解决方案2】:

if 语句中添加break 以阻止for 循环继续进行。

public void filter (String[] words, String text){

    for(int i = 0; i < words.length; i++){

          if(text.toLowerCase().contains(words[i].toLowerCase())){
              System.out.println(text);
              break; //this will stop processing your for loop
          }
    }

}

【讨论】:

  • 您需要为if 语句添加大括号,否则您将在第一次迭代后中断for 循环。
  • 你应该修复缩进,然后你就会明白为什么你当前的代码不能按预期工作。
【解决方案3】:

您可以在System.out.println(text); 之后添加break 语句以退出for 循环。但是,您需要使用大括号,否则您将在第一次迭代后中断 for 循环。

public void filter (String[] words, String text) {
    for (int i = 0; i < words.length; i++) {
        if(text.toLowerCase().contains(words[i].toLowerCase())) {
            System.out.println(text);
            break;
        }
    }
}

在你的情况下,我建议不要使用 for 循环,do/while 或简单的 while 会更合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2020-03-30
    • 2011-04-22
    • 2020-04-02
    • 2014-03-24
    • 2022-01-16
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多