Java:配列のプリミティブ型のデータの種類なautobox
-
21-08-2019 - |
質問
している方法のようになります:
public static <T> boolean isMemberOf(T item, T[] set)
{
for (T t : set) {
if (t.equals(item)) {
return true;
}
}
return false;
}
そしてこのメソッドを呼び出しを使用 char
のための T
:
char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, chars);
この方法でやらねばならない。私は期待し char
や char[]
車autoboxedる Character
や Character[]
, そのように見えません。
他の知?
解決
配列の場合、唯一のプリミティブのためのオートボクシングはありません。私はこれがあなたの問題であると考えています。
他のヒント
なぜchar[]
はCharacter[]
するために箱詰めされるだろうか?配列はそう何ボクシングが必要とされない。の常にの参照型、です。
さらに、それは恐ろしく高価になる - それは新しい配列を作成し、順番に各文字をボクシング伴うだろう。む〜!
あなたは配列のすべてのタイプのために働く方法を取得するためにリフレクションを使用することができますが、型の安全性を失うことになるので、これはあなたが望むものはおそらくありません。
import java.lang.reflect.Array
public static boolean isMemberOfArray(Object item, Object array)
{
int n = Array.getLength(array)
for (int i = 0; i < n; i++) {
if (Array.get(array, i).equals(item)) {
return true;
}
}
return false;
}
修正、アレイのためのオートボクシングがない(int[] ints; ...; Arrays.asList(ints)
ような場合には奇妙になる! - asListは単一のオブジェクト、配列を含むリストを返す)
ここでは、配列をボックスに簡単なユーティリティです。
public static Integer[] boxedArray(int[] array) {
Integer[] result = new Integer[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
あなたはもちろん、それぞれのプリミティブ型の異なるバージョンが必要になります。
アレイは、事の低レベルの実装タイプです。 char[]
は、2バイト文字とメモリの連続した領域になります。 Character[]
は4または8バイトの参照でメモリの連続した領域になります。あなたは、char []をラップするCharacter[]
を取得することはできません。しかしList<Character>
はchar[]
を包むことができます。
の参照の配列は、通常は良いアイデアではありません。ご希望の場合は、書き込みやjava.util.Arrays.asList
と同等のものを得ることができます。
、プリミティブの配列のためのオートボクシングは存在しません。あなたはプリミティブ配列を使用してメソッドを使用したい場合は、それぞれのプリミティブ型の過負荷を提供する必要があります。これは、クラスライブラリに物事の標準的な方法のようです。 java.util.Arrays 、例えば
まず、私の代わりにリストを使用し、することができます限りの配列を避けるようにしようとするだろう。
配列にはオートボクシングはありませんが、可変引数のためにそこにオートボクシングされています。だから、あなたは(同じボディを持つ)として、あなたのメソッドを宣言した場合:
public static <T> boolean isMemberOf(T item, T ... set)
あなたが書くことができます。
isMemberOf('a', 'a', 'b', 'c');
は個人的に、私はあなたが
のようなものを書くことができ、Googleのグアバを使用して好みますchar ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0]));
あなたのコードは、おそらく単なる一例でしたが、あなたは本当にメンバーシップをテストしたい場合は、あなたの中に、このようにそれを行うことができます:
Chars.contains(chars, ch);
or
ImmutableSet.of('a', 'b', 'c').contains('a')
のJava 8を入力して、primArray
は、タイプPrimType[]
の識別子でみましょう、あなたははは次の操作を行うことができます。
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);
これを行うための簡単な方法がある。
char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;