2012-09-05 101 views
-3

我是一個Java noob,我有特殊的問題。 讓我們考慮其中multipe字母的重複在一個字符串:java字符串重複的字母表

String a="AAABBBAACCBBDD" 

我與forcharAt嘗試這種多次。 預期輸出:

"ABCD" 

是否有此操作的任何想法,讓輸出任何內建的功能?

+6

什麼代碼你使用的時間最接近解決方案? – Hbcdev

+1

請發佈你到目前爲止。我們希望看到您的努力。 –

+1

我不明白這個問題。只是迭代角色並記住目前爲止發現的角色......例如通過使用inbult'String b = a.charAt(0)'使用Set – home

回答

2

我會做類似

public static String dedup(String text) { 
    Set<Character> seen = new LinkedHashSet<Character>(); 
    StringBuilder sb = new StringBuilder(); 
    for (char c : text.toCharArray()) 
     if (seen.add(c)) 
      sb.append(c); 
    return sb.toString(); 
} 
+0

+1;但如果字母是'CBAAABBBAACCBBDD',則鏈接的集合將失敗。根據需要,可能需要對最終設置進行排序...... – home

+0

@home鏈接集將如何失敗?這將按照外觀順序打印「CBAD」。 –

+0

這就是我所要求的「要求」 - 輸出可能必須以字典/自然順序(「ABCD」而不是'CBAD')提供。 – home

4

您可以通過字符串的字符建立了一套獨特的字符重複:

String a = "AAABBBAACCBBDD"; 
Set<Character> charSet = new HashSet<String>(); 
for (char c : a.toCharArray()) 
{ 
    charSet.add(c); 
} 

然後,你可以設定轉換到一個列表,並對其進行排序顯示/ toString()用途:

List<Character> uniqueCharList = new ArrayList<Character>(charSet); 
Collections.sort(uniqueCharList); 

// Convert List<Character> to char[] 
// see http://stackoverflow.com/q/6649100/139010 for a more concise library call 
char[] uniqueCharArray = new char[uniqueCharList.size()]; 
for (int i=0; i<uniqueCharArray.length; i++) 
{ 
    uniqueCharArray[i] = uniqueCharList.get(i); 
} 

String result = new String(uniqueCharArray); 
+1

我會使用LinkedHashSet來保存順序;;) –

+0

這並不提供按字典排序。更好的是當你完成所有工作時,使用List,IMO進行排序。 –

+0

它不清楚OP是否需要外觀順序或ASCII順序。 –

-2

你不需要列表或設置爲此。只需字符串來存儲一切。我希望這沒有錯誤。

String result = ""; 
for(int i = 0; i < a.length(); i++) 
    if(!result.contains(a[i])) { 
      result += a[i];   
    } 
+3

-1。這將具有可靠的漸近運行時性能。每次調用'String#contains()'是_O(n)_,循環中的字符串連接是_O(n²)_。 –

+1

它理論上有用,但如果字符串非常長,會怎麼樣?重新考慮你的方法。 – Franklin