2012-03-31 22 views
0

我想查找字符串中的唯一字符數。解決方案必須儘可能高效(時間複雜度爲O(N);非常大的數組;一般爲大O)。我決定這樣做(如果你有更好的解決方案,請讓我知道)。唯一的問題是,當我嘗試運行它時,它總是說只有一個不同的值。看來Collections.addAll方法有問題(也許我錯了)。請讓我知道如何解決它。它似乎只是在數組中的第一個字符。謝謝。收藏夾addAll方法的一組唯一值

String ds = "acvdgefav"; 
    char[] sa = ds.toCharArray(); 

    for (int i=0; i<sa.length; i++) 
     System.out.println(sa[i]); 
    System.out.println(); 
    System.out.println(sa.length); 
    System.out.println(); 

    HashSet hs = new HashSet(); 
    Collections.addAll(hs, sa); 
    for (int i=0; i<hs.size(); i++) 
     System.out.println(sa[i]); 
    System.out.println(); 
    int z = hs.size(); 
    System.out.println(z); 

回答

4

我建議你使用泛型,因爲它會在代碼中找到一個錯誤,就像使用調試器來遍歷代碼一樣。

最有效的方法是使用BitSet。這可能比使用HashSet快10倍,但會有相同的時間複雜度。

+0

請更具體的如何使用BitSet與此代碼。我嘗試了泛型,但addAll方法在我試圖將HashSet 放入它時被拒絕。 – aretai 2012-03-31 14:48:07

+1

'for(int i = 0; i 2012-03-31 16:43:35

0

我認爲使用Collections.addAll那樣只會陣列自身添加到組,而不是它的字符。另見this

import java.util.*; 
class a{ 
    static <T> void f(T...a){ 
     System.out.println(a.getClass().getCanonicalName()); 
     System.out.println(a.length); 
     System.out.println(a[0].getClass().getCanonicalName()); 
     System.out.println(); 
    } 
    public static void main(String[]args){ 
     f(1,2,3); 
     f(new int[]{1,2,3}); 
     f(new Integer[]{1,2,3}); 
    } 
} 

輸出:

java.lang.Integer[] 
3 
java.lang.Integer 

int[][] 
1 
int[] 

java.lang.Integer[] 
3 
java.lang.Integer 

基本上是一個可變參數的方法採取的通用陣列將最終獲得一個Object...,作爲Object[],這是不符合int[]兼容實現,所以得到int[]盒裝。

而且,這樣的:

for (int i=0; i<hs.size(); i++) 
    System.out.println(sa[i]); 

是錯誤的。 isa中的字符之間沒有任何關係。

+0

那麼我試圖做的是使用設置規範(沒有重複的元素),並簡單地將數組中的所有元素添加到一個集合(重複不會被添加),所以總之只有不同的值會在那裏。然後使用size(),我知道了。你是對的行(複製粘貼eh)Iterator i = hs.iterator(); (i.hasNext()) System.out.println(i.next());但隨後它會返回一些不相關的值。我查了兩個Collections.addAll()和Arrays.asList()只認爲這種方式會更有效 – aretai 2012-03-31 14:52:59

+0

我錯了'Arrays.asList',我想同樣的事情發生。 – Vlad 2012-03-31 16:33:30

+0

然後我將需要降級你;) – aretai 2012-03-31 17:07:49