2014-12-06 29 views
1

我有價值的字符串作爲|| HelpDesk || IT人員|| IT人員|| Admin ||審計|| HelpDesk ||如何刪除具有分隔符的字符串中的重複值

我正在嘗試編寫代碼,它應該刪除重複項並返回保留demiliters的唯一值,例如:|| HelpDesk || IT Staff || Admin || Audit ||

我的代碼是使用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+"||"); 


} 

感謝

+0

分割字符串由''||(您需要逃避這些字符,或使用'Pattern.quote')。從Set中的元素構造String時,可以返回分隔符。 – 2014-12-06 08:39:06

+0

願我們知道你嘗試過這麼遠嗎? – SMA 2014-12-06 08:40:13

+0

考慮從HashSet中提取獨特的元素出來後回加的分隔符。 – user314104 2014-12-06 08:42:48

回答

1

您可以使用LinkedHashSet來保留廣告訂單。一旦你用「||」分割字符串只需在構建字符串時添加分隔符。

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流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||)。

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)可以做到這一點。

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 
    } 
0

這裏是一個基於正則表達式,一個內膽:

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

這是通過替換每個後跟本身通過查詢使用一個反向引用提前斷言前面傳來的術語。

這裏有一個非正則表達式的Java 8一個班輪:

Arrays.stream(str.substring(1).split("[|]")).distinct().collect(Collectors.joining("|", "|", "|")); 
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也(木):

所以,與其Seperator.join(listToSet, "||");

你必須:Joiner.on("||").join(listToSet);

相關問題