質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

21901閲覧

ArrayListの要素数を固定したい

Wind

総合スコア442

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2018/01/18 01:38

編集2018/01/18 02:15

ArrayListの要素数を初期化時に固定したいです。

○サンプル

Java

1static class clsTest{ 2 public String strTest; 3 public ArrayList<Integer> intTest = new ArrayList<>(8); // 要素数 8 4} 5 6private clsTest test = new clsTest(); // 初期化 7 8private subTest() 9{ 10test.strTest = "TEST"; 11for(int i=0;i<8;i++) 12//test.intTest.set(i,i); // 配列が無くてエラー? 13test.intTest.add(i); // 毎回追加する 14}

○やりたいこと
classを作成した時に要素数を指定しているので、その数で固定したいです。
subTest()を2回呼び出してしまうとintTestの要素数が16になってしまうので、
毎回addで追加せず、setで中身の値を変えるだけにしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

この例の場合、配列を使うのが最適解だと思います。

java

1int[] intArray = new int[8];

理由は、addremoveもしない固定サイズのデータ構造にjava.util.Listインタフェースはオーバスペックだからです。真面目にサイズ固定のListをつくろうとするとそれなりに考えることがたくさんあります。Windさんが図らずもメソッド呼び出しの副作用を述べているように、8要素のListを手に入れたとしても、addremoveもできるわけですから、実際には意味がないことがわかります。

それはそれとして、単に要素8で初期化されたListを手に入れたいなら、java.util.Collectionsを使うことができます。この例の場合、各要素には初期値としてnullが入ります。

java

1List<Integer> intList = Collections.nCopies(8, null);

投稿2018/01/18 02:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wind

2018/01/18 03:22

ありがとうございます。 おっしゃる通り、用途は指定した場所に値を入れるだけで挿入や削除は不要なので、 固定長配列で良いのですが、 関数に渡す時の引数がArrayListでしたので、何とかArrayListで出来ないか考えていました。 配列に入れてから、関数に渡す時にArrayListに変換する様にしてみます。
退会済みユーザー

退会済みユーザー

2018/01/18 03:32

どういたしまして。一つ追加のアドバイスですが、関数の引数や戻りの型は、ArrayListのような具体実装を使わず、Listのようにインタフェースにするとよいですよ。そういう作りにしておけば、後でクラスの内部実装をArrayListからLinkedListに変えたり、今回の例のようにCollectionsで生成したListに変えても、ほかに影響がなくなります。
guest

0

リミットを設ける機能はないです。
少し勘違いをしているようですが、
「 ArrayList<>(8)」で初期値の要素が8個作れるわけではありません。
8個分の領域を確保するだけです。

なので、初回のset段階ではaddで要素が追加されていなので、indexのエラーになります。
subTestの中でサイズを見て上限を決めるか、ただの配列定義にするのが良いと思います。
※どうしてもの場合は、ArrayListを拡張して、上限付きの機能を追加

投稿2018/01/18 02:42

himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wind

2018/01/18 03:14

ArrayListは可変長なので、(8)を指定しても8個の固定長になる訳では無く、 「とりあえず8個分用意したけど、それ以上も追加出来る」ってことなのですね。 sizeで上限をチェックする・・・は、とても大変そうなので見送ります。
guest

0

add する前に clear するのではダメなのですか?
または固定長なら ArrayList でなく配列の方がいいかもしれません。

投稿2018/01/18 02:32

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wind

2018/01/18 03:12

回答ありがとうございます。 毎回clearして毎回addするのってとても怖くって。 やっぱり配列ですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問