JAva配列回転listエラー
4165 ワード
AVaにおける配列回転リストはArrays.asList(T...a)メソッドを用いる.
例:
実行結果:
この方法はとても便利で、分かりやすいです.しかし、以下の2点に注意する必要があります.
一、基本データ型をリストに変換できない
よく見ると、asListが受け入れるパラメータは汎用的な長さ変化パラメータであり、基本データ型は次のように汎用化できないことがわかります.
これはintタイプの配列をパラメータとしているため,変換後のリストにはint[]要素が1つしか含まれていない.
ソリューション:
基本データ型の配列をパッケージ型のlistに変換するには、guavaクラスライブラリのツールメソッドを使用します.例は次のとおりです.
二、asListメソッドは配列の1つのビューを返す
ビューは、このlistに対する操作が元の配列に反映されることを意味し、このlistは一定長であり、add、removeなどの長さを変える方法はサポートされていない.
output:
理由:
get(i)? size()? 問題ありません.
add()? ,この操作はサポートされていません!!
どうしてですか.Arrays.asList(T...a)メソッドが何をしているのか見てみましょう.
う~ん、なんでもないみたいで、ArrayLIstの実例が返ってきましたね.コードをもっと見てください.
これは何ですか.元に戻ったArrayListはjava.util.ArrayListではなく、Arraysの内部クラスのインスタンスです.たちまちだまされたような気がした.
この内部類にどんな方法があるか見てみましょう.確かにadd方法はないようですね.
ではaddメソッドを使用するにはどうすればいいのでしょうか.
外層にjava.util.ArrayListをもう1層包装すればいいだけです.
最後に、Arrays.asListメソッド自体は何の問題もなく、変換されたlistに対してどのような操作をするかを見るだけで、listの要素をクエリーする必要があるだけであれば、直接使用すればよい.要素を追加、削除する必要がある場合は、java.util.ArrayListを包装して使用しましょう.
例:
public
class
App {
public
static
void
main(String[] args) {
List stringA = Arrays.asList(
"hello"
,
"world"
,
"A"
);
String[] stringArray = {
"hello"
,
"world"
,
"B"
};
List stringB = Arrays.asList(stringArray);
System.out.println(stringA);
System.out.println(stringB);
}
}
実行結果:
[hello, world, A]
[hello, world, B]
この方法はとても便利で、分かりやすいです.しかし、以下の2点に注意する必要があります.
一、基本データ型をリストに変換できない
よく見ると、asListが受け入れるパラメータは汎用的な長さ変化パラメータであり、基本データ型は次のように汎用化できないことがわかります.
public
class
App {
public
static
void
main(String[] args) {
int
[] intarray = {
1
,
2
,
3
,
4
,
5
};
//List list = Arrays.asList(intarray);
List<
int
[]> list = Arrays.asList(intarray);
System.out.println(list);
}
}
output:
[[I
@66d3c617
]
これはintタイプの配列をパラメータとしているため,変換後のリストにはint[]要素が1つしか含まれていない.
ソリューション:
基本データ型の配列をパッケージ型のlistに変換するには、guavaクラスライブラリのツールメソッドを使用します.例は次のとおりです.
int
[] intArray = {
1
,
2
,
3
,
4
};
List list = Ints.asList(intArray);
二、asListメソッドは配列の1つのビューを返す
ビューは、このlistに対する操作が元の配列に反映されることを意味し、このlistは一定長であり、add、removeなどの長さを変える方法はサポートされていない.
public
class
App {
public
static
void
main(String[] args) {
int
[] intArray = {
1
,
2
,
3
,
4
};
List list = Ints.asList(intArray);
list.set(
0
,
100
);
System.out.println(Arrays.toString(intArray));
list.add(
5
);
list.remove(
0
);
}
}
output:
[
100
,
2
,
3
,
4
]
UnsupportedOperationException
UnsupportedOperationException
理由:
get(i)? size()? 問題ありません.
add()? ,この操作はサポートされていません!!
どうしてですか.Arrays.asList(T...a)メソッドが何をしているのか見てみましょう.
う~ん、なんでもないみたいで、ArrayLIstの実例が返ってきましたね.コードをもっと見てください.
これは何ですか.元に戻ったArrayListはjava.util.ArrayListではなく、Arraysの内部クラスのインスタンスです.たちまちだまされたような気がした.
この内部類にどんな方法があるか見てみましょう.確かにadd方法はないようですね.
ではaddメソッドを使用するにはどうすればいいのでしょうか.
外層にjava.util.ArrayListをもう1層包装すればいいだけです.
最後に、Arrays.asListメソッド自体は何の問題もなく、変換されたlistに対してどのような操作をするかを見るだけで、listの要素をクエリーする必要があるだけであれば、直接使用すればよい.要素を追加、削除する必要がある場合は、java.util.ArrayListを包装して使用しましょう.