0

我有一个char[]. 我希望能够判断它是否是一个,如果是,则使用数组值Set创建一个新的。Set我知道我可以使用一个try-catch块,但是有没有任何内置的 Java 方法可以用来测试它而不会引发错误。我不必使用char[]. 我也可以使用列表或其他东西。

4

3 回答 3

10

我有一个字符 []。我想知道它是否是一个集合

不会的。不可能。它可能具有不同的值,但不会Set.

如果您真的想检查数组是否包含不同的值,最简单的方法可能是创建 aSet<Character>并检查是否有任何add操作返回false

public static boolean uniqueValues(char[] values) {
    Set<Character> set = new HashSet<Character>();
    for (char c : values) {
        if (!set.add(c)) {
            return false;
        }
    }
    return true;
}

(这会让你在找到副本后尽早退出,而不是继续构建整个系列。)

另一种方法是创建一个boolean[]大小为 65536 的字符来查看你有哪些字符:

public static boolean uniqueValues(char[] values) {
    boolean[] seen = new boolean[65536];
    for (char c : values) {
        int index = c;
        if (seen[index]) {
            return false;
        }
        seen[index] = true;
    }
    return true;
}

对于小型数组,这将极大地浪费内存 - 对于较大的数组(具有不同元素或重复出现较晚的地方),它比该HashSet方法更节省空间。

于 2013-07-29T06:46:27.523 回答
5

您可以使用运算符测试变量是否来自某种类型instanceof

if (myVar instanceof Set) {
    System.out.println("It's a Set.");
    //do what you want/need
}

尽管如此,instanceof运算符的使用似乎是您设计中的一个问题。更重要的是,您不能instanceof在数组中使用运算符来检查它是否为Collection.


编辑:根据您对问题的最后评论,您想查找数组中是否存在重复元素。您可以使用JonSkeet 的回答Set中解释的方法来执行此操作(无需重写他已经提供的逻辑和解释)。

于 2013-07-29T06:41:39.523 回答
0

如果您考虑对类型使用“泛型”,系统可能有 List 用于它可以存储的类型以检查 Set,您可以在比较中使用“instanceof”测试运算符。

List<Object[]> alist = new ArrayList<Object[]>();
//setup the list of arrays
if(alist.get(0) instanceof Set){
// do what you do with a set
}else{
// do what you require
}
于 2013-07-29T07:40:05.867 回答