私は持っていchar[]
ます。それが であるかどうかを判断できるようにしたいと思います。そうであれば、配列の値をSet
使用して新しい を作成します。Set
ブロックを使用できることはわかっていますtry-catch
が、エラーをスローせずにこれをテストするために使用できる Java 用の組み込みメソッドはありますか。を使用することは必須ではありませんchar[]
。リストなどを使用することもできます。
3 に答える
私は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;
}
(これにより、セット全体を構築し続けるのではなく、重複を見つけたらすぐにアウトになります。)
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
小さな配列の場合、これはメモリを非常に浪費します-大きな配列(個別の要素の場合、または複製が遅れて発生する場合)の場合、アプローチよりもスペース効率が高くなります。
instanceof
演算子を使用して、変数が特定の型からのものであるかどうかをテストできます。
if (myVar instanceof Set) {
System.out.println("It's a Set.");
//do what you want/need
}
それでも、instanceof
演算子の使用は設計上の問題のようです。さらにinstanceof
、配列で演算子を使用して、それが であるかどうかを確認してはなりませんCollection
。
編集:質問の最後のコメントに基づいて、配列に重複した要素があるかどうかを調べたいと考えています。JonSkeet の回答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
}