2014-01-11 52 views
0

我的要求是,如果我有2個字符串,我應該得到2個字符串的交集 - 意味着返回沒有重複的字符串的公共元素。使用集合的2個數組的交集

我的做法是:

String str1="Character"; 
String str2="National"; 

Set<Character> set1=new HashSet<Character>(); 
Set<Character> set2=new HashSet<Character>(); 

for(char c:str1.toLowerCase().toCharArray()){ 
    set1.add(c); 
} 

for(char c:str2.toLowerCase().toCharArray()){ 
    set2.add(c); 
} 

Set<Character> inter=new HashSet<Character>(set1); 
Set<Character> union=new HashSet<Character>(set1); 

inter.retainAll(set2); 
union.addAll(set2); 

現在交集包含交與幷包含聯合爲:

交叉口集:[T,A] 聯盟集:[T,E ,c,r,a,n,o,l,h,i]

但我想要將這些集合轉換回字符串爲「ta」和「tecranolhi」。

我正在使用String arr1[]=inter.toArray(new String[0]);但它給出了一個錯誤。

**Exception in thread "main" java.lang.ArrayStoreException: java.lang.Character 
     at java.util.AbstractCollection.toArray(Unknown Source) 
     at StringInter.main(StringInter.java:22)** 

有人可以澄清這一點嗎?

+1

'inter'是'Character'的集合,而不是'String'。你爲什麼不用'Character'數組呢? –

+0

將set中的這些字符轉換爲字符串需要遵循什麼方法? – jazz199

+0

創建一個'StringBuilder',遍歷'Set'並追加每個字符。最後,調用'sb.toString()'並將這個結果分配給你的'String'變量。 –

回答

2
StringBuilder builder = new StringBuilder(); 
for (Character c : inter) { 
    builder.append(c.charValue()); 
} 
String interAsString = builder.toString(); 
+0

感謝您的解決方案。它適合我。你能告訴我什麼是retainAll()和addAll()方法的時間複雜性。或者說,一般HashSet的方法? – jazz199

3

正如我所說的,創建一個StringBuilder,通過Set迭代並追加每個字符。最後,請致電sb.toString()並將此結果分配給您的String變量。

這裏也是一個解決方案:

String s = inter.stream().collect(StringBuilder::new, 
            StringBuilder::append, 
            StringBuilder::append).toString(); 
0

請參考下面的代碼片段:

StringBuffer b = new StringBuffer(); 
Iterator i = inter.iterator(); 
while(i.hasNext()) 
{ 
    b.append(i.next().toString()); 
} 
String interString = b.toString(); 

現在,interString將有你想要的東西。希望這可以幫助。