Java dizisine dinamik olarak nasıl öğe ekleyebilirim?


86

PHP'de, aşağıdakileri yaparak dizilere dinamik olarak eleman ekleyebilirsiniz:

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

Bundan sonra, $xböyle bir dizi olacaktır: {1,2}.

Java'da benzer bir şey yapmanın bir yolu var mı?


4
Aşağıdaki tüm cevaplar için ArrayList kullanır ancak OP özellikle Array'i ister. En iyi şekilde bilmek isterim.
KJYe.Name 葉家仁

4
cevap "Hayır" dır. Java'da bildirim / oluşturma sırasında dizinin boyutunu belirlemeniz (veya tüm öğeleri doldurmanız) gerekir. Lütfen java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

Çeşitli Java işlevlerinin diziler döndürdüğünü fark ettim, bu yüzden File.java'daki list (filtre) uygulamasına baktım. Dahili olarak bir List kullanır ve sonra onu sonunda bir diziye dönüştürür. List <String> v = new ArrayList <> (); ... return v.toArray (yeni Dize [v.size ()]);
xtempore

Yanıtlar:


112

Java.util.LinkedList veya java.util.ArrayList'e bakın

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

21
Bu tek parça dışında mükemmel bir cevap. Normalde Java'da ilkel diziler yerine List'leri kullanırız, ancak aslında ilkel bir diziye (gibi int[]) ihtiyaç duyduğunuz örnekler için yalnızcatoArray() yöntemi . Yukarıdaki kodu kullanın, ancak x.toArray()ilkel bir Dizi elde etmek için kullanın .
2012'de

1
Vakaların% 99'unda (vakaların% 99,99999'u gibi) gerçekten ilkel bir diziye ihtiyacınız varsa, yanlış bir şey yapıyorsunuzdur ve OO ilkeleri ile ele alınmalıdır. Yerel kodla veya Oracle ARRAYnesneleri gibi bir şeyle veya bunun gibi saçmalıklarla arayüz oluşturmadığınız sürece , ilkel dizilerden kaçınmanız çok daha iyidir.
corsiKa

11
oh, ilkel dizileri nasıl kullanmamanız gerektiğiyle ilgili tüm bu yorumlar, keşke bu kadar kolay olsaydı :(
thecoshman

1
@trusktr Bunu yapmanın bir nedeni bu. Bu örnekte, daha doğrusu ... bir Listreferans kullanmak ArrayList, istediğimiz zaman kaldırıma tekmelememizi sağlar . Birisi daha iyi bir liste yayınlarsa, mesela SuperDuperAwesomeList, referansımızı atarsak yapacak çok işimiz olabilir ArrayList. ArrayList'te List'in sahip olmadığı şeyler vardır. Kodumuzdaki bu şeylere güvenirsek, takas etmek çok daha zor hale gelir.
corsiKa

1
@corsiKa, bazı sıkıştırma / kodlama algoritmalarını ilkeller olmadan yazın ve bu durumlar 99'dan çok daha yaygın. (9). Маtrix çığlık ilkelleri de içerir. Bir flip notta, yerel kodla etkileşime girerseniz, ilkel diziler yerine DirectBuffers kullanırsınız. Sonunda birinin metale ihtiyacı var, eğer veritabanları ve sunumla sıkışıp kaldıysanız, sorun değil, ancak% 99 ifadesi çok saçma.
bestsss

65

Java'daki dizilerin boyutu sabittir, bu nedenle PHP'de olduğu gibi "sonuna bir şey ekleyemezsiniz".

PHP davranışına biraz benzer:

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

O zaman yazabilirsiniz:

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

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

Ancak bu şema, her seferinde tüm dizinin bir kopyasını oluşturduğundan, daha büyük diziler için korkunç derecede verimsizdir . (Eski dizileriniz aynı kaldığı için aslında PHP ile tamamen eşdeğer değildir).

PHP dizileri aslında "max key" eklenmiş bir Java HashMap ile tamamen aynıdır, bu yüzden bir sonra hangi anahtarın kullanılacağını ve garip bir yineleme sırası (ve Tamsayı anahtarları ile bazı Strings arasında garip bir denklik ilişkisi) bilecektir. Ancak, basit indekslenmiş koleksiyonlar için, önerilen diğer cevaplayıcılar gibi Java'da bir Liste kullanın.

Kullanmaktan kaçınmak istiyorsanız List Tamsayıdaki her int'i sarmalama ek yükü nedeniyle , dahili olarak dizileri kullanan ancak her değişiklikte bir kopya oluşturmayan ilkel türler için koleksiyonların yeniden uygulamalarını kullanmayı düşünün, yalnızca dahili dizi dolu olduğunda ( tıpkı ArrayList gibi). (Hızlı bir şekilde Google'da araştırılan bir örnek bu IntList sınıfıdır .)

Guava içeren bu sarma oluşturma yöntemleri de Ints.asList, Longs.asListvs.


kabul edilen çözümden çok daha akıllı. israf edilmiş nesneler yok.
sis

2
@Mihail: Aslında normalde bunu yapmanızı önermiyorum, çünkü bir elemanın her eklenmesi için yeni bir dizi oluşturulur ve tüm içerik kopyalanır. (Kullanım durumunuza bağlıdır, yine de - nadiren bir şey ekler / kaldırırsanız ve sık sık
yinelerseniz / ararsanız

Yeni sürümlerdeki ArrayUtils, bunu yapan yönteme sahiptir. Uygulamayı kontrol etmekte oldukça tembelim, ancak iyi yazdıklarından oldukça eminim.
sis

1
@MihailStoynov Aslında, esasen budur ArrayList- her eklemede yeniden boyutlandırmak yerine, oda tükendiğinde boyut olarak iki katına çıkar, böylece sık sık yeniden boyutlandırmak zorunda kalmaz.
corsiKa

1
@Mav Hayır, çünkü orgdaha kısa result.
Paŭlo Ebermann

19

Apache Commons, yeni dizinin sonuna bir öğe eklemek için bir ArrayUtils uygulamasına sahiptir :

/** 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
Daha yeni ArrayUtils'te: ArrayUtils.appendElement (String.class, origArray, "new element")
marmor

12

Bu soruyu web'de çok sık gördüm ve bence itibarı yüksek birçok kişi bu sorulara doğru cevap vermedi. Bu yüzden burada kendi cevabımı ifade etmek istiyorum.

İlk önce ve arasında bir fark olduğunu düşünmeliyiz .arrayarraylist

Soru , ArrayList yerine bir diziye öğe eklemenizi ister.


Cevap oldukça basit. 3 adımda yapılabilir.

  1. Diziyi bir dizi listesine dönüştür
  2. ArrayList'e eleman ekle
  3. Yeni arrayList'i diziye geri dönüştür

İşte basit resmi görüntü açıklamasını buraya girin

Ve son olarak işte kod:

Aşama 1:

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

Adım 2:

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

            list.add(element);
            return list;
    }

Aşama 3:

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

4. adım

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

1
Oy verildi çünkü sonunda biri gerçek bir dizi ile ArrayList arasındaki farkı söyledi ...
JoeG

En eksiksiz ve açıklayıcı cevap.
Obaid

11

Bir kullanabilir ArrayListve ardından toArray()yöntemi kullanabilirsiniz . Ancak ne yaptığınıza bağlı olarak, bir diziye hiç ihtiyacınız olmayabilir. Listsİstediğinizden daha fazlası olup olmadığına bakın .

Bakınız: Java Listesi Eğitimi



4

JAVA'da Koleksiyon Çerçevelerini kullanarak bir diziye dinamik olarak eleman ekleyebilirsiniz. collection Framework, ilkel veri türleri üzerinde çalışmaz.

Bu Koleksiyon çerçevesi "java.util. *" Paketinde bulunacaktır.

Örneğin, ArrayList kullanıyorsanız,

Bir nesne oluşturun ve ardından öğe sayısı ekleyin (String, Integer ... vb. Herhangi bir tür)

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

Şimdi bir diziye 3 öğe eklediniz.

eklenen öğelerden herhangi birini kaldırmak istiyorsanız

a.remove("suman");

tekrar herhangi bir öğe eklemek isterseniz

a.add("Gurram");

Yani dizi boyutu dinamik olarak artıyor / azalıyor ..



0

ilkel dizide nerede olduğunuzu bir sayın

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;
    }
}

Bunun, yeni öğeleri dinamik olarak bir Java ilkel dizisine eklemenin mümkün olup olmadığı konusundaki orijinal soruyla hiçbir ilgisi yoktur.
Joe Günü

0

Bu, javada bir diziye eklemenin basit bir yoludur. Orijinal dizimi saklamak için ikinci bir dizi kullandım ve sonra ona bir eleman daha ekledim. Ondan sonra o diziyi orijinal diziye geri gönderdim.

    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'da dizi boyutu sabittir, ancak dizini ve for döngüsünü kullanarak sabit boyutlu bir diziye dinamik olarak öğeler ekleyebilirsiniz. Lütfen aşağıdaki örneği bulun.

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()));
        }
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.