集合为一组唯一值添加addAll方法

时间:2012-03-31 14:33:18

标签: java collections time-complexity

我正在尝试查找String中的唯一字符数。解决方案必须尽可能高效(时间复杂度为O(N);非常大的数组;通常为Big O)。我决定这样做(如果你有更好的解决方案,请告诉我)。唯一的问题是,当我尝试运行它时,它总是说只有一个不同的值。似乎Collections.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);

2 个答案:

答案 0 :(得分:4)

我建议您使用泛型,因为它会在代码中发现错误,就像使用调试程序来逐步执行代码一样。

最有效的方法是使用BitSet。这可能比使用HashSet快10倍,但具有相同的时间复杂度。

答案 1 :(得分: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[]不兼容,因此{{1}被盒装了。

另外,这个:

int[]

错了。 for (int i=0; i<hs.size(); i++) System.out.println(sa[i]); i中的字符之间没有任何关系。