如何删除具有分隔符的字符串中的重复值

时间:2014-12-06 08:35:45

标签: java delimiter duplicate-data

我的字符串值为|| HelpDesk || IT人员|| IT人员||管理员||审核|| HelpDesk ||

我正在尝试编写应该删除重复项的代码并返回保留像这样的demiliters的唯一值|| HelpDesk || IT人员||管理员||审核||

我的代码使用HashSet删除重复项,但问题是它是删除分隔符。如何通过仅删除重复值来保留分隔符。

删除重复项并添加后退分隔符后,下面是我的代码。但不确定是否有简单的方法可以做到这一点。

public static void main(String[] args) {
    TestDuplicates testDuplicates = new TestDuplicates();
    String bRole = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
    List<String> listWithoutDuplicates = new ArrayList<String>();
    String noDup = "";
    List<String> splittedStringList =
        new ArrayList<String>();
    SplitOperations splitOperations =
        new SplitOperations();
    splittedStringList =
            splitOperations.splitString(bRole);
    for (int i = 0; i < splittedStringList.size(); i++) {

        HashSet<String> listToSet = new HashSet<String>(splittedStringList);

        listWithoutDuplicates = new ArrayList<String>(listToSet);


    }
    for(int i=0;i<listWithoutDuplicates.size();i++){
         noDup = noDup + "||"+listWithoutDuplicates.get(i);
        System.out.println(listWithoutDuplicates.get(i));
    } 
    System.out.println("No Duplicate is::"+ noDup+"||");


}

由于

5 个答案:

答案 0 :(得分:1)

您可以使用LinkedHashSet来保留广告订单。用“||”拆分字符串后只需在构造String时添加分隔符。

 String s = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
 Set<String> set = new LinkedHashSet<>(Arrays.asList(s.split(Pattern.quote("||"))));
 String noDup = "||";
 for(String st : set) {
     if(st.isEmpty()) continue;
     noDup += st+"||";
 }

或者使用新的java 8 Stream API:

 String noDup = "||"+
     Arrays.stream(s.split(Pattern.quote("||")))
           .distinct()
           .filter(st -> !st.isEmpty()) //we need to remove the empty String produced by the split
           .collect(Collectors.joining("||"))+"||";

两种方法都会产生相同的结果(||HelpDesk||IT Staff||Admin||Audit||)。

答案 1 :(得分:0)

public String removeDublicate () {
    String str = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
    String split[] = str.split("\\|\\|");

    String newStr = "";

    for (String s : split) {
        if (!s.isEmpty() && !newStr.contains(s)) {
            newStr += "||" + s;
        }
    }

    newStr += "||";

    return newStr;
}

那样的东西? str可能是一个争论。

编辑#1

如果您想摆脱&& !newStr.contains(s),可以改用HashSet<String>。我认为这样做太过分了。当字符串很小时,.contains(s)会执行此操作。

答案 2 :(得分:0)

这应该可行,如果你愿意,它也会保持元素序列。请注意,我还没有编写代码来重新分隔分隔符。

public static void main(String s[]){

        String a = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
        a = a.replaceAll("\\|\\|",",");
        String arr[] = a.split(",");
        //linked hash set in case you want to maintain the sequence of elements
        Set<String> set = new LinkedHashSet<String>(Arrays.asList(arr));
        set.remove("");
        System.out.println(set);
        //Iterate through the set and put your delimiters here again
    }

答案 3 :(得分:0)

这是一个基于正则表达式的一个班轮:

str = str.replaceAll("(\\|[^|]+)(?=.*\\1\\|)", "");

这可以通过使用后向引用的前瞻断言替换每个后面的任何术语。

这是一个非正则表达式java 8 one liner:

Arrays.stream(str.substring(1).split("[|]")).distinct().collect(Collectors.joining("|", "|", "|"));

答案 4 :(得分:0)

使用Guava lib它是一个单行:

Joiner.on("||").skipNulls(Splitter.on("||").trimResults().split(<target_string>);)

以下是我的尝试:

import java.util.*;

public class Seperator {
  public static void main(String[] args) {

    String bRole = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";

    List<String> listWithoutDuplicates = new ArrayList<String>();

    String noDup = "";

    List<String> splittedStringList = new ArrayList<String>();

    splittedStringList = Arrays.asList(bRole.split("\\|\\|"));

    LinkedHashSet<String> listToSet = new LinkedHashSet<String>(splittedStringList);

    noDup = Seperator.join(listToSet, "||");

    System.out.println("No Duplicate is::"+ noDup+"||");
  }

  public static String join(Set<String> set, String sep) {
    String result = null;
    if(set != null) {
      StringBuilder sb = new StringBuilder();
      Iterator<String> it = set.iterator();
      if(it.hasNext()) {
        sb.append(it.next());
      }
      while(it.hasNext()) {
        sb.append(sep).append(it.next());
      }
      result = sb.toString();
    }
    return result;
  }
} 

LinkedHashSet主要用于保存顺序和当前获取唯一元素。加入是非常标准的,但我们也可以使用Google's Guava Library(Joiner):

所以,而不是Seperator.join(listToSet, "||");

您将拥有:Joiner.on("||").join(listToSet);