从字符串中删除重复的单词

时间:2019-03-16 14:31:46

标签: java string algorithm

我有一个像这样的字符串:

  

你好,你好吗?

     

我喜欢饼干,饼干,苹果和煎饼煎饼。

我希望输出:

  

你好,你好吗?

     

我喜欢饼干,苹果和煎饼。

到目前为止,我已经编码:

String[] s = input.split(" ");
String prev = s[0];
String ans = prev + " ";

for (int i = 1; i < s.length; i++) {

    if (!prev.equals(s[i])) {
        prev = s[i];
        ans += prev + " ";
    }
}

System.out.println(ans);

我得到的输出为:

  

你好,你好吗?

     

我喜欢饼干,饼干,苹果和煎饼煎饼。

我需要, . ! ? .的逻辑方面的帮助。.

3 个答案:

答案 0 :(得分:3)

您可以使用regex为您完成此操作。示例代码:

String regex = "\\b(\\w+)\\b\\s*(?=.*\\b\\1\\b)";
input = input.replaceAll(regex,"");
  1. \b匹配单词字符和非单词字符之间的单词边界位置或位置(字符串的开始/结束)。
  2. \w匹配任何单词字符(字母数字和下划线)。
  3. \b匹配单词字符和非单词字符之间的单词边界位置或位置(字符串的开始/结束)。
  4. \s匹配任何空白字符(空格,制表符,换行符)。
  5. *匹配0或更多个前面的令牌。
  6. (?=匹配主表达式后的组,但不将其包括在结果中。
  7. .匹配除换行符以外的任何字符。
  8. \1与步骤2中捕获组#1的结果匹配。

注意:在此处使用单词边界以避免与部分单词匹配非常重要。

以下是正则表达式演示和说明的链接:RegexDemo

答案 1 :(得分:2)

您应该使用辅助变量来存储您的单词,而不要使用标点符号。

String[] s = input.split(" ");
String ans = "";

for (int i = 0; i < s.length - 1; i++) {

    String currentAux = s[i].replaceAll("[,.!?]", "");
    String nextAux = s[i + 1].replaceAll("[,.!?]", "");

    if (nextAux.equals(currentAux)) {
        continue;
    }

    ans += " " + s[i];
}

ans += " " + s[s.length - 1];

System.out.println(ans);

答案 2 :(得分:2)

您可以使用var numbers = Array(255).map(function(v, i) { return i + 1; }); var opposite_brightness = numbers.reverse()[numbers.indexOf(brightness)]; 来标记单词。确保设置分隔符以分割单词。在您的情况下,它们是空格,逗号和句号。这可以帮助您拆分不带标点符号的单词。然后,您可以将前一个令牌与当前令牌进行比较,如果它们相等,则可以忽略它。

您可以尝试以下代码段:

java.util.StringTokenizer