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