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

Java 从字符串中删除重复的单词,java,string,algorithm,Java,String,Algorithm,我有一个字符串,比如: 你好,你好吗 我喜欢饼干、苹果和煎饼 我希望得到一个结果: 你好,你好吗 我喜欢饼干、苹果和煎饼 到目前为止,我已经编写了代码: 字符串[]s=input.split; 字符串prev=s[0]; 字符串ans=prev+; 对于int i=1;i

我有一个字符串,比如:

你好,你好吗

我喜欢饼干、苹果和煎饼

我希望得到一个结果:

你好,你好吗

我喜欢饼干、苹果和煎饼

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

字符串[]s=input.split; 字符串prev=s[0]; 字符串ans=prev+; 对于int i=1;i 你好,你好吗

我喜欢饼干、苹果和煎饼

我需要一些关于…的逻辑帮助

您可以使用regex来完成这项工作。示例代码:

String regex = "\\b(\\w+)\\b\\s*(?=.*\\b\\1\\b)";
input = input.replaceAll(regex,"");
\b匹配单词字符和非单词字符之间的单词边界位置或字符串的起始/结束位置。 \w匹配任何单词字符字母数字和下划线。 \b匹配单词字符和非单词字符之间的单词边界位置或字符串的起始/结束位置。 \s匹配任何空格、制表符、换行符。 *匹配前面的0个或多个标记。 ?=匹配主表达式后的组,但不将其包含在结果中。 . 匹配除换行符以外的任何字符。 \1与步骤2中捕获组1的结果匹配。 注意:这里使用单词边界很重要,以避免匹配部分单词


这里有一个指向regex演示和解释的链接:

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

字符串[]s=input.split; 字符串ans=; 对于int i=0;i 您可以尝试以下代码段:

我喜欢饼干、苹果和煎饼。; StringTokenizer tokenizer=新的StringTokenizer,,,true; List duplicateRemovedTokenList=新建LinkedList; 字符串prevToken=null; 而tokenizer.hasMoreTokens{ 字符串currentToken=tokenizer.nextToken; 如果currentToken.equals{ duplicateRemovedTokenList.addcurrentToken; 持续 } if!currentToken.equalsprevToken{ duplicateRemovedTokenList.addcurrentToken; prevToken=currentToken; } } String duplicateRemovedString=StringUtils.joinduplicateRemovedTokenList;
@JBNizet我不觉得你的评论很粗鲁,这篇文章的作者说他需要逻辑方面的帮助,这意味着他已经知道它们是不同的,而且他已经知道这会带来问题,建议他调试并不能解决问题problem@JBNizet是的,我知道饼干不等于饼干,。我需要帮助处理逻辑,以便我的程序将其视为相同的,并添加一个带有标点符号的,可能与您需要的内容重复的名称。@TiiJ7,有一个错误的格式用法-文本引号的代码引号样式。你能解释一下正则表达式pls吗-我们应该如何理解它?我添加了一个演示和解释的链接,你可以在那里修改它以查看和比较结果。可能要注意的是,按照目前编写的,如果在输入输入can't can't将导致“can't”表示你好吗?它回复你好你好吗?是missing@SandeepRanjan现在再试一次:这是一个很好的答案,但我认为你应该在调用replaceAll时添加冒号和分号,因为像我吃了一顿大餐这样的句子;然而,我又饿了。将无法正确处理-膳食将出现两次。@D.B.我们添加了很多符号,我使用的符号是问题末尾要求的符号。这有一些问题,它会添加额外的空格,并且不适用于像我喜欢饼干、饼干、苹果和煎饼这样的输入。注意第一个cookies后面的额外逗号。