我正在尝试查找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);
答案 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
中的字符之间没有任何关系。