我正在研究java代码,我想删除重复的单词。如果我在任何单词中获得空格,以下代码可以正常删除它们:
1298 Anthony 1298 Anthony
,它会像:
1298 Anthony
但对于任何其他特殊角色,例如:
1298 Anthony.ef 1298 Anthony.ef
,它会显示如下:
ef. 1298 Anthony
。
我的方法在下面给出,我想让它适用于每个特殊字符,特别是:昏迷(,),fullstop(。),破折号( - ),下划线(_)。请帮我解决这个问题。
public static void removeString(){
String name1 = "1298 Anthony.ef 1298 Anthony.ef";
String[] strArr = name1.split(" ");
Set<String> set = new HashSet<String>(Arrays.asList(strArr));
String[] result = new String[set.size()];
set.toArray(result);
StringBuilder res = new StringBuilder();
for (int i = 0; i < result.length; i++) {
String string = result[i];
if(i==result.length-1){
res.append(string);
}
else{
res.append(string).append(" ");
}
}
System.out.println(res.toString());
String abc = res.toString();
}
答案 0 :(得分:2)
你在空格周围分裂name1
。您可以尝试将name1
分割为any non-word character:
names.split("\\W+");
方法String.split接受正则表达式作为参数。引用文档:
将此字符串拆分为给定正则表达式的匹配项。
name1.split(" ");
在单个空格周围拆分字符串并返回数组:[1298, Anthony.ef, 1298, Anthony.ef]
names.split("\\W+");
在任何非单词字符(逗号,点,短划线等)周围分割字符串并返回数组:[1298, Anthony, ef, 1298, Anthony, ef]
正如您在本案中所看到的,它能够将Anthony.ef
拆分为单独的字符串。
更新:如果您想在原始字符串中保留单词的顺序,则可能需要使用LinkedHashSet
而不是HashSet
。例如:
public static void removeString(){
String name1 = "1298 Anthony.ef 1298 Anthony.ef";
String[] strArr = name1.split("\\W+");
Set<String> set = new LinkedHashSet<String>(Arrays.asList(strArr));
String[] result = new String[set.size()];
set.toArray(result);
StringBuilder res = new StringBuilder();
for (int i = 0; i < result.length; i++) {
String string = result[i];
if(i==result.length-1){
res.append(string);
}
else{
res.append(string).append(" ");
}
}
System.out.println(res.toString());
String abc = res.toString();
}
查看此问题:Is there an insertion order preserving Set that also implements List?