Java配列にアイテムを動的に追加するにはどうすればよいですか?


85

PHPでは、次の方法で配列に要素を動的に追加できます。

$x = new Array();
$x[] = 1;
$x[] = 2;

この後、次の$xような配列になります{1,2}

Javaで同様のことを行う方法はありますか?


4
以下のすべての回答にはArrayListを使用していますが、OPは特にArrayを要求します。私も知りたいです。
KJYe.Name葉家仁

4
答えは「いいえ」です。Javaでの宣言/作成時に、配列のサイズを指定する(またはすべての要素にデータを入力する)必要があります。java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

さまざまなJava関数が配列を返すことに気付いたので、File.javaのlist(filter)の実装を調べました。内部でリストを使用し、最後にそれを配列に変換します。List <String> v = new ArrayList <>(); ... return v.toArray(new String [v.size()]);
xtempore 2015

回答:


112

java.util.LinkedListまたはjava.util.ArrayListを見てください

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

21
これはワンピースを除いて完璧な答えです。通常、Javaではプリミティブ配列の代わりにListを使用しますが、実際にプリミティブ配列が必要な場合(などint[])は、toArray()Listのメソッドを使用するだけです。上記のコードを使用しますが、を使用x.toArray()してプリミティブ配列を取得します。
rharter 2012

1
99%のケース(99.99999%のケースのように)では、実際にプリミティブ配列が必要な場合、何か間違ったことをしているので、オブジェクト指向の原則で処理する必要があります。ネイティブコード、またはOracleARRAYオブジェクトのようなもの、またはそのような愚かなものとインターフェイスしているのでない限り、プリミティブ配列を避ける方がはるかに良いでしょう。
corsiKa 2012

11
ああ、それが簡単だったとしても、プリミティブ配列を使用すべきではないというこれらすべてのコメント:(
thecoshman 2013

1
@trusktrそれがそれをする理由の1つです。この例では、それは...の線に沿っています。List参照を使用するArrayListと、いつでも縁石にキックできます。誰かがのようなより良いリストをリリースした場合SuperDuperAwesomeList、参照をにした場合、やるべきことがたくさんあるかもしれませんArrayList。ArrayListには、Listにはないものがあります。コード内でこれらのものに依存している場合、スワップアウトするのははるかに困難になります。
corsiKa 2013年

1
@corsiKa、プリミティブなしでいくつかの圧縮/エンコードアルゴリズムを記述します。これらのケースは、99よりもはるかに一般的です。(9)Маtrixはスクリームの原始的なものも意味します。ちなみに、ネイティブコードを操作する場合は、プリミティブ配列ではなくDirectBufferを使用します。結局のところ、誰かが金属に固執する必要があります。データベースとプレゼンテーションに固執している場合、それは問題ありませんが、99%のステートメントはばかげています。
bestsss 2014年

64

Javaの配列は固定サイズであるため、PHPの場合のように「最後に何かを追加」することはできません。

PHPの動作に少し似ています:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

次に、次のように書くことができます。

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

しかし、このスキームは、毎回アレイ全体のコピーを作成するため、大きなアレイはひどく非効率的です。(そして、古い配列は同じままなので、実際にはPHPと完全に同等ではありません)。

PHP配列は、実際には「最大キー」が追加されたJava HashMapとまったく同じであるため、次に使用するキーと、奇妙な反復順序(および整数キーといくつかの文字列の間の奇妙な同値関係)がわかります。ただし、単純なインデックス付きコレクションの場合は、他の回答者が提案したように、Javaのリストを使用することをお勧めします。

Listすべてのintを整数でラップするオーバーヘッドのために使用を避けたい場合は、プリミティブ型のコレクションの再実装を使用することを検討してください。これは、内部で配列を使用しますが、内部配列がいっぱいの場合にのみ、すべての変更でコピーを実行しません( ArrayListのように)。(グーグルですぐに見られる例の1つは、このIntListクラスです。)

グアバは含まれていなラッパーの作成方法ではInts.asListLongs.asListなど


受け入れられているソリューションよりもはるかに賢いです。無駄なオブジェクトはありません。
ミスト

2
@Mihail:実際には、要素を追加するたびに新しい配列が作成され、コンテンツ全体がコピーされるため、通常はこれを行うことはお勧めしません。(ただし、ユースケースによって異なります。ほとんど何も追加/削除せず、頻繁に反復/検索する場合は、問題ない可能性があります。)
PaŭloEbermann2011

新しいバージョンのArrayUtilsには、それを行うメソッドがあります。私は実装をチェックするのがかなり怠惰ですが、彼らがそれをうまく書いていると確信しています。
ミスト

1
@MihailStoynov実際には、これは基本的に何をするかですArrayList-追加するたびにサイズを変更する代わりに、部屋がなくなるとサイズが2倍になるため、頻繁にサイズを変更する必要がありません。
corsiKa 2012

1
@Mavいいえ、orgはより1つ短いためですresult
パウロEbermann

19

Apache Commonsには、新しい配列の最後に要素を追加するためのArrayUtils実装があります

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)

2
新しいArrayUtilsでは、次のようになります。ArrayUtils.appendElement(String.class、origArray、 "new element")
marmor

12

私はこの質問をウェブで頻繁に見ましたが、私の意見では、評判の高い多くの人々がこれらの質問に適切に答えていませんでした。それで、ここで私自身の答えを表現したいと思います。

まず、との間に違いがあることを考慮する必要がarrayありarraylistます。

質問は、ArrayListではなく、配列に要素追加することを求めています


答えは非常に簡単です。それは3つのステップで行うことができます。

  1. 配列を配列リストに変換する
  2. arrayListに要素を追加します
  3. 新しいarrayListを配列に変換し直します

これがその簡単な写真です ここに画像の説明を入力してください

そして最後にここにコードがあります:

ステップ1:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

ステップ2:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

ステップ3:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

ステップ4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}

1
最後に誰かが...実際の配列とArrayListの間の差を呼んためUpvoted
JoeG

最も完全で説明的な答え。
Obaid 2017

11

を使用してArrayListから、toArray()メソッドを使用できます。ただし、実行している内容によっては、配列がまったく必要ない場合もあります。Listsあなたが望むものがもっとあるかどうかを調べてください。

参照:Javaリストチュートリアル



4

JAVAのコレクションフレームワークを使用して、配列に要素を動的に追加できます。コレクションフレームワークは、プリミティブデータ型では機能しません。

このコレクションフレームワークは、「java.util。*」パッケージで利用可能になります

たとえば、ArrayListを使用する場合、

オブジェクトを作成してから、いくつかの要素(String、Integer ...などの任意のタイプ)を追加します。

ArrayList a = new ArrayList();
a.add("suman");
a.add(new Integer(3));
a.add("gurram");

これで、配列に3つの要素が追加されました。

追加された要素のいずれかを削除したい場合

a.remove("suman");

要素を追加したい場合も

a.add("Gurram");

したがって、配列サイズは動的に増加/減少しています。



0

プリミティブ配列のどこにいるかを数えます

class recordStuff extends Thread
{
    double[] aListOfDoubles;
    int i = 0;

    void run()
    {
        double newData;
        newData = getNewData(); // gets data from somewhere

        aListofDoubles[i] = newData; // adds it to the primitive array of doubles
        i++ // increments the counter for the next pass

        System.out.println("mode: " + doStuff());
    }

    void doStuff()
    {
        // Calculate the mode of the double[] array

        for (int i = 0; i < aListOfDoubles.length; i++) 
        {
            int count = 0;
            for (int j = 0; j < aListOfDoubles.length; j++)
            {
                if (a[j] == a[i]) count++;
            }
            if (count > maxCount) 
            {
                maxCount = count;
                maxValue = aListOfDoubles[i];
            }
        }
        return maxValue;
    }
}

これは、Javaプリミティブ配列に新しいアイテムを動的に追加できるかどうかという元の質問とは実際には何の関係もありません。
ジョー・日

0

これは、Javaで配列に追加する簡単な方法です。2つ目の配列を使用して元の配列を格納し、さらに1つの要素を追加しました。その後、その配列を元の配列に戻しました。

    int [] test = {12,22,33};
    int [] test2= new int[test.length+1];
    int m=5;int mz=0;
    for ( int test3: test)        
    {          
    test2[mz]=test3; mz++;        
    } 
    test2[mz++]=m;
    test=test2;

    for ( int test3: test)

    {
      System.out.println(test3);
    }

0

Javaでは、配列のサイズは固定されていますが、インデックスとforループを使用して、固定サイズの配列に要素を動的に追加できます。以下の例をご覧ください。

package simplejava;

import java.util.Arrays;

/**
 *
 * @author sashant
 */
public class SimpleJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try{
            String[] transactions;
            transactions = new String[10];

            for(int i = 0; i < transactions.length; i++){
                transactions[i] = "transaction - "+Integer.toString(i);            
            }

            System.out.println(Arrays.toString(transactions));

        }catch(Exception exc){
            System.out.println(exc.getMessage());
            System.out.println(Arrays.toString(exc.getStackTrace()));
        }
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.