0

基本的に、実行時にサイズが大きくなる 2 次元配列を作成したいと考えています。Javaでベクトルを使用してこれを行うことはできますか?

これらは正しいでしょうか?

int [] [] x = 新しい x [100] [100];

ベクトル x= 新しいベクトル();

配列に要素を追加するには-

for i=0 to 99
   for j=0 to 99
   x.addElement(x[i] [j]);

基本的には、他のオブジェクトを参照するのと同じですが、ここでのみ、インデックス番号も指定する必要がありますよね?

私はJavaの初心者です。だから私は助けていただければ幸いです!

4

5 に答える 5

1

残念ながら、Javaには2D配列も2D成長ベクトルもありません。

配列の配列またはベクトルのベクトルがあります。

あなたの例では、Objectsの1Dベクトルを作成しました。

Vector x= new Vector();

タイプの成長する配列に似ていますObject[] x

だから、あなたがするとき

y.addElement(x[i][j]);

Javaは「ボクシング」を行います。つまり、

y.addElement(new Integer(x[i][j]));

1D配列に100x100の要素を追加したため、自分で位置を計算する必要があります

y.get(i*numcols+j)

したがって、これをすべて回避するには、以下の例のようなベクトルのベクトルを使用します。この例では、新しく固定されたサイズの配列をベクトルのベクトルにコピーします。

   // creates fixed size 2D array with zeros
    int [] [] x = new int [50][50]; 

    // creates empty vector of vectors of integers
    // y is of type Vector<Vector<Integer>>
    // y.get(row) is of type Vector<Integer>>
    // y.get(row).get(col) is of type Integer
    Vector<Vector<Integer>> y = new Vector<Vector<Integer>>(); 

    // set the size of vector of vectors (number of rows)
    // each row will be null for now
    y.setSize(x.length);

    // enumerating rows
    for(int row=0; row<x.length; ++row) {

        log.info("row {}", row);

        // assign empty vector for row
        y.set(row, new Vector<Integer>());

        // set row size (number of columns)
        y.get(row).setSize(x[row].length);

        // enumerating columns of current row
        for(int col=0; col<x[row].length; ++col) {

            // setting the value for a cell
            y.get(row).set(col, x[row][col]);

        }
    }
于 2012-11-14T12:04:15.747 に答える
1

最適化する必要があるケースを知らずに、何を提案すればよいかを知ることは困難です。

たとえば、マップを囲むこの単純なラッパーは、特定のインデックスを設定および取得するために最適化された疎な 2D マトリックスです (「成長」する必要はまったくありません) が、すべてのインデックスを反復処理するには適していません。

public class SparseMatrix<T> {
    private final Map<Coordinates, T> map = new HashMap<Coordinates, T>();
    private final T defaultValue;

    public SparseMatrix(T defaultValue) {
       this.defaultValue = defaultValue;
    }

    private static class Coordinates {
        private final int[] coordinates;

        Coordinates(int... coordinates) {
            this.coordinates = coordinates;
        }

        @Override
        public boolean equals(Object o) {
            return Arrays.equals(coordinates, ((Coordinates)o).coordinates);
        }

        @Override
        public int hashCode() {
            return Arrays.hashCode(coordinates);
        }
    }

    public T get(int x, int y) {
        T value = map.get(new Coordinates(x, y));
        if ( value == null ) {
            return defaultValue;
        }
    }

    public T set(int x, int y, T val) {
        return map.put(new Coordinates(x, y), val);
    }
} 

使用法:

SparseMatrix<Integer> matrix = new SparseMatrix<Integer>(0);
matrix.set(3, 5, 7);
int seven = matrix.get(3, 5);
int zero = matrix.get(3, 6); //not set yet, uses default    

また、N次元にも非常に簡単に適応できます。もちろん、実稼働コードでは、独自のコードを作成するのではなく、より良い仕事をするライブラリを使用します。

于 2012-11-14T05:18:32.437 に答える
1

You can use ArrayList which is equivalent to dynamic array.

ArrayList<ArrayList<Integer>> aDynamicArray = new ArrayList<ArrayList<Integer>>(2);
aDynamicArray.add(new ArrayList<Integer>());
aDynamicArray.add(new ArrayList<Integer>());

Now you can use you for loop as following:

int [] [] x = new x [2] [100];
for i=0 to 1 
   for j=0 to 99
       aDynamicArray.get(i).add(x[i] [j]);

EDIT:

if i wanted to access x[2] [3] , how would i do that in the arraylist?

x[2][3] means value at 3rd row and 4th column. So, Fisrt line of code will change as follows: (to accomodate 3 rows)

ArrayList<ArrayList<Integer>> aDynamicArray = new ArrayList<ArrayList<Integer>>(3);
for(int i=0; i<3, i++)
{
    aDynamicArray.add(new ArrayList<Integer>());
}

then following line will give you access to x[2][3]:

aDynamicArray.get(2).get(3);
于 2012-11-14T05:26:06.197 に答える
0

Java では次のようになります。

int [][] x = new int [100] [100]

ArrayList <Integer> y = new ArrayList();

y.add(some number);

Arraylistに関する詳細情報

Java では、さまざまなデータ型で構成されたコレクションを作成できます。例えば

ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);

したがって、ArrayList の ArrayList なども使用できます。

于 2012-11-14T05:01:26.717 に答える
0

配列のサイズがわかっている場合(99と述べています)、 Javaに精通している場合は、要素を追加するときに配列のサイズを監視することによりint[][] intA = new int[100][100]、独自のGrowingを実装できます。int[][]

intA[99][99] = someIntこの時点で最後の要素を追加すると仮定し、新しい配列を作成してから、既存の配列int[][] newIntA = new int[intA.length+25][100];の内容をコピーする必要がありますintAnewIntA

またはArrayList<ArrayList<Integer>>、値を追加するか、ArrayList[]その選択を使用するために使用できます。

于 2012-11-14T05:16:47.987 に答える