Javaで配列の配列を作成する方法


115

仮説として、5つの文字列配列オブジェクトがあります。

String[] array1 = new String[];
String[] array2 = new String[];
String[] array3 = new String[];
String[] array4 = new String[];
String[] array5 = new String[];

別の配列オブジェクトにこれらの5つの文字列配列オブジェクトを含める必要があります。どうすればいいのですか?別のアレイに配置できますか?


43
Noobの質問は深刻な場合があります。実際、彼らは頻繁にそうです。:-)
TJクラウダー

3
関連する質問と答えは、メモリ調整がどのように行われるかを誰が知っているかについては明らかではありません。+1
ベンジ

回答:


153

このような:

String[][] arrays = { array1, array2, array3, array4, array5 };

または

String[][] arrays = new String[][] { array1, array2, array3, array4, array5 };

(後者の構文は、変数宣言の場所以外の割り当てで使用できますが、短い構文は宣言でのみ機能します。)


2番目の構文の機能を詳しく説明していただけますか?それは私にはちょっと不明瞭です。
Terence Ponce

4
@Terence:最初と同じです:文字列配列参照の配列を作成し、値array1、array2、array3、array4、array5に初期化します-それぞれが文字列配列参照です。
Jon Skeet、2011年

1
簡単な質問:作成される配列オブジェクトの数がわからない場合、実行時にこれをどのように行うのですか?
Terence Ponce、

1
@テレンス:より具体的な例を挙げていただけますか?コンパイル時に初期値を指定すると、サイズわかります。のような意味new String[10][]ですか?
Jon Skeet、2011年

はい。ピーターの答えに似ています。
Terence Ponce

71

試す

String[][] arrays = new String[5][];

1
これはもっと柔軟性があります
hetaoblog '19

配列に固定サイズを定義してはいけませんか?
フィリップ2013

@Filipは5に固定されています。次のレベルを設定すると、それらが事前に割り当てられますが、これは変更できるため、設定しないと役に立たない場合があります。
Peter Lawrey 2013

8
配列にデータを挿入するにはどうすればよいですか?その動的データなら?
Prakhar Mohan Srivastava

1
@PrakharMohanSrivastava要素を個別に設定できます。arrays[0] = new String[] {"a", "b", "c"}または一時リストを使用します。<pre> <code> List <String []> myList = new ArrayList <>(); myList.add(new String [] {"a"、 "b"、 "c"}); myList.add(new String [] {"d"、 "e"、 "f"}); myList.toArray(arrays); </ code> </ pre>
kntx 2018

26

それを行う方法を説明する2つの優れた答えがありますが、別の答えが欠けているように感じます。ほとんどの場合、それを行うべきではありません。

配列は扱いにくく、ほとんどの場合、コレクションAPIを使用した方がよいでしょう。

コレクションを使用すると、要素を追加および削除でき、さまざまな機能(インデックスベースのルックアップ、並べ替え、一意性、FIFOアクセス、同時実行性など)に特化したコレクションがあります。

もちろん配列とその使用法について知っておくことは良いことですが、ほとんどの場合、コレクションを使用するとAPIがはるかに管理しやすくなります(そのため、Google Guavaのような新しいライブラリは配列をほとんど使用しません)。

だから、あなたのシナリオでは、私はリストのリストを好み、グアバを使用してそれを作成します:

List<List<String>> listOfLists = Lists.newArrayList();
listOfLists.add(Lists.newArrayList("abc","def","ghi"));
listOfLists.add(Lists.newArrayList("jkl","mno","pqr"));

String [] []より少し複雑ですが、データの連結など、より多くの操作が可能です。ただし、ソリューションではデータのサイズが保証されないため、問題が発生する可能性があります。
ベンジ

1
@Benj必要に応じて、特定の数のアイテムのみを受け入れるリストデコレータを作成することは常に可能です。
Sean Patrick Floyd

正確なデコレータ/ラッパーは、一貫性を確保するための良い方法です。したがって、私たちが話している方法は、単純な配列よりもはるかに複雑です。私がやったことは、exixts(...)などのいくつかの基本的なメソッドをカプセル化する小さなユーティリティクラスArray2D <T>です。これを以下に投稿しました。
ベンジ2012年

6

Sean Patrick Floydで私がコメントで述べたクラスがあります。WeakReferenceを必要とする特殊な使用法でそれを行いましたが、どのオブジェクトでも簡単に変更できます。

これがいつか誰かを助けることを願っています:)

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;


/**
 *
 * @author leBenj
 */
public class Array2DWeakRefsBuffered<T>
{
    private final WeakReference<T>[][] _array;
    private final Queue<T> _buffer;

    private final int _width;

    private final int _height;

    private final int _bufferSize;

    @SuppressWarnings( "unchecked" )
    public Array2DWeakRefsBuffered( int w , int h , int bufferSize )
    {
        _width = w;
        _height = h;
        _bufferSize = bufferSize;
        _array = new WeakReference[_width][_height];
        _buffer = new LinkedList<T>();
    }

    /**
     * Tests the existence of the encapsulated object
     * /!\ This DOES NOT ensure that the object will be available on next call !
     * @param x
     * @param y
     * @return
     * @throws IndexOutOfBoundsException
     */public boolean exists( int x , int y ) throws IndexOutOfBoundsException
    {
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
        }
        if( _array[x][y] != null )
        {
            T elem = _array[x][y].get();
            if( elem != null )
            {
            return true;
            }
        }
        return false;
    }

    /**
     * Gets the encapsulated object
     * @param x
     * @param y
     * @return
     * @throws IndexOutOfBoundsException
     * @throws NoSuchElementException
     */
    public T get( int x , int y ) throws IndexOutOfBoundsException , NoSuchElementException
    {
        T retour = null;
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
        }
        if( _array[x][y] != null )
        {
            retour = _array[x][y].get();
            if( retour == null )
            {
            throw new NoSuchElementException( "Dereferenced WeakReference element at [ " + x + " ; " + y + "]" );
            }
        }
        else
        {
            throw new NoSuchElementException( "No WeakReference element at [ " + x + " ; " + y + "]" );
        }
        return retour;
    }

    /**
     * Add/replace an object
     * @param o
     * @param x
     * @param y
     * @throws IndexOutOfBoundsException
     */
    public void set( T o , int x , int y ) throws IndexOutOfBoundsException
    {
        if( x >= _width || x < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ x = " + x + "]" );
        }
        if( y >= _height || y < 0 )
        {
            throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ y = " + y + "]" );
        }
        _array[x][y] = new WeakReference<T>( o );

        // store local "visible" references : avoids deletion, works in FIFO mode
        _buffer.add( o );
        if(_buffer.size() > _bufferSize)
        {
            _buffer.poll();
        }
    }

}

使い方の例:

// a 5x5 array, with at most 10 elements "bufferized" -> the last 10 elements will not be taken by GC process
Array2DWeakRefsBuffered<Image> myArray = new Array2DWeakRefsBuffered<Image>(5,5,10);
Image img = myArray.set(anImage,0,0);
if(myArray.exists(3,3))
{
    System.out.println("Image at 3,3 is still in memory");
}

4
努力して+1してください。ただし、intフィールドを-1に初期化してコンストラクタで再割り当てする代わりに、それらをfinalにして、コンストラクタでのみ割り当てる必要があります。
Sean Patrick Floyd

1
@Sean:私はコードを変更しました( "no-GC buffer"を使用して新しいコードを投稿しました(賢明なコメントを含みます)
Benj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.