如何判断数组或列表是否也是一组?

时间:2013-07-29 06:39:33

标签: java

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

3 个答案:

答案 0 :(得分:10)

  

我有一个char []。我想能够判断它是否是一个集

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

如果您确实想要检查数组是否包含不同的值,最简单的方法可能是创建Set<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;
}

(一旦找到副本,就会提前退出,而不是继续构建整个集合。)

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

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方法更节省空间。

答案 1 :(得分:5)

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

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

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


编辑:根据您在问题中的最后一条评论,您想要查找阵列中是否存在重复元素。您可以使用JonSkeet's answer中所述的Set执行此操作(无需重写他已提供的逻辑和解释)。

答案 2 :(得分:0)

如果您考虑对类型使用“泛型”系统可能具有可以存储以检查Set的类型的List,则可以在比较中使用“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
}