在Java中从字符串中移除重复的值

15

请问有谁能告诉我如何从中删除重复的值?

String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 

输出应该如下所示

String s="Bangalore-Chennai-NewYork-";

使用Java..

任何帮助将不胜感激。


1
你确定要在结果末尾加上 "-" 吗? - Martijn Courteaux
15个回答

38

这可以一行代码搞定:

public String deDup(String s) {
    return new LinkedHashSet<String>(Arrays.asList(s.split("-"))).toString().replaceAll("(^\\[|\\]$)", "").replace(", ", "-");
}

public static void main(String[] args) {
    System.out.println(deDup("Bangalore-Chennai-NewYork-Bangalore-Chennai"));
}

输出:

Bangalore-Chennai-NewYork

注意顺序得以保留 :)

关键点如下:

  • split("-")将不同的值作为数组返回
  • Arrays.asList()将该数组转换为List
  • LinkedHashSet保留插入顺序以及唯一性-它完成了提供唯一值的所有工作,这些唯一值通过构造函数传递
  • 一个List对象的toString()方法返回的格式为:[元素1, 元素2, ...]
  • 最终的replace命令从toString()结果中删除了“标点符号”

此解决方案要求值不包含字符序列", "-对于如此简洁的代码而言,这是一个合理的要求。

Java 8 更新!

当然,这只有一行代码:

public String deDup(String s) {
    return Arrays.stream(s.split("-")).distinct().collect(Collectors.joining("-"));
}

正则表达式更新!

如果您不关心保留顺序(即删除重复项的第一个出现是可行的):

public String deDup(String s) {
    return s.replaceAll("(\\b\\w+\\b)-(?=.*\\b\\1\\b)", "");
}

我会使用substring()来剪切括号,并将其分成两行完成。 - Martijn Courteaux
@MartijnCourteaux 你可以将其分成多行,但这个答案也展示了如何在一行中完成它的方法。 - Bohemian

4
public static String removeDuplicates(String txt, String splitterRegex)
{
    List<String> values = new ArrayList<String>();
    String[] splitted = txt.split(splitterRegex);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < splitted.length; ++i)
    {
        if (!values.contains(splitted[i]))
        {
            values.add(splitted[i]);
            sb.append('-');
            sb.append(splitted[i]);
        }
    }
    return sb.substring(1);

}

使用方法:

String s = "Bangalore-Chennai-NewYork-Bangalore-Chennai";
s = removeDuplicates(s, "\\-");
System.out.println(s);

输出:

Bangalore-Chennai-NewYork

2

你可以将字符串添加到 HashSet 中。

  1. 使用“-”分割字符串。
  2. 将每个单词存储在数组中,即 arr[]。

代码片段:

Set<String> set = new HashSet<String>();

    for(int i=0; i < arr.length; i++){
      if(set.contains(arr[i])){
        System.out.println("Duplicate string found at index " + i);
      } else {
        set.add(arr[i]);
      }

2
或者使用LinkedHashSet来保持原始顺序。 - Maurice Perry
4
你是认真的吗?你正在检查字符串是否已经存在于集合中。但是集合的整个意义在于它不包含重复项。那段代码是多余的! - Aaron Chambers

1
static String RemoveDuplicateCharInString(String s){
    for (int i = 0; i < s.length(); i++) {
        if((s.substring(i+1)).indexOf(s.charAt(i))!=-1){
            s=s.substring(0,i+1)+(s.substring(i+1)).replaceAll(""+s.charAt(i),"");
        }
    }
    return s;
}

1
你应该简要介绍一下你的代码解决方案以及它如何回答 OP 的问题,让他们能够理解,而不仅仅是发布代码。 - hypern

1

通过使用-进行分割创建字符串数组,然后从中创建一个哈希集。

String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 
String[] strArr = s.split("-");
Set<String> set = new HashSet<String>(Arrays.asList(strArr));

如果你想将它作为字符串数组返回,请执行以下操作:
String[] result = new String[set.size()];
set.toArray(result);

这是一个示例代码来实现这个功能:
String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 
String[] strArr = s.split("-");
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());

输出:-

Bangalore-Chennai-NewYork

1

实现思路:

  1. 使用分隔符“-”解析字符串并拆分令牌
  2. 将令牌加载到Collection
  3. 遍历Collection并删除重复项
  4. 使用结果Collection构建新字符串

最棘手的部分应该是第3步,但并非不可能。如果使用Set,则可以跳过此步骤。

编辑:也许您可以在添加元素之前进行存在性检查以替代第2&3步。


0
有点晚了,但我会简单地使用HashMap。它易于理解,并且在键上具有快速查找功能,可能不是最好的方法,但在我看来仍然是一个很好的答案。当我需要快速格式化时,我经常使用它。
                    String reason = "Word1 , Word2 , Word3";
                    HashMap<String,String> temp_hash = new HashMap<String,String>();
                    StringBuilder reason_fixed = new StringBuilder();
                    //in:
                    for(String word : reason.split(",")){
                        temp_hash.put(word,word);
                    }
                    //out:
                    for(String words_fixed : temp_hash.keySet()){
                        reason_fixed.append(words_fixed + " , ");
                    }
                    //print:
                    System.out.println(reason_fixed.toString());

0
public static void main(String[] args) {
    String str="Bangalore-Chennai-Newyork-Bangalore-Chennai";
    String output="";
    String [] arr=str.split("-");

    LinkedHashSet<String> lhs=new LinkedHashSet<String>();
    for (int i = 0; i < arr.length; i++) {
        lhs.add(arr[i]);
    }
    for(String s:lhs){
        output=output+s+"-";
    }

    System.out.println(output);
}

最好解释一下解决方案是什么,而不仅仅是粘贴解决方案的代码。 - Jose Gómez

0
public class RemDuplicateWordFromString {
public static void main(String[] args) {
    String s1 = "Hello India Hello India Hello India Hello India";
    countWords(s1);
}
public static void countWords(String s1) {
    String[] s2 = s1.split(" ");
    for (int i = 0; i < s2.length; i++) {
        for (int j = i + 1; j < s2.length; j++) {
            if (s2[i].equals(s2[j])) {
                if (i != j) {
                    s2[i] = "";
                }
            }
        }
    }
    for (int i = 0; i < s2.length; i++) {
        if (s2[i] != "") {
            System.out.print(s2[i] + " ");
        }

    }

}

}


0
StringBuilder builderWord = new StringBuilder(word);
for(int index=0; index < builderWord.length(); index++) {
    for(int reverseIndex=builderWord.length()-1; reverseIndex > index;reverseIndex--) {
        if (builderWord.charAt(reverseIndex) == builderWord.charAt(index)) {
            builderWord.deleteCharAt(reverseIndex);
        }
    }
}
return builderWord.toString();

请不要仅仅发布没有上下文说明的代码块 - 请同时包含解释。 - CertainPerformance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接