Ukuran array dinamis Java?


106

Saya memiliki kelas - xClass, yang ingin saya muat ke dalam array xClass jadi saya deklarasi:

xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();

Namun, saya tidak tahu apakah saya perlu 10. Saya mungkin perlu 8 atau 12 atau nomor lain dalam hal ini. Saya tidak akan tahu sampai runtime. Bisakah saya mengubah jumlah elemen dalam array dengan cepat? Jika ya, bagaimana caranya?


Saya telah memperbaiki pemformatan pertanyaan, Anda dapat memilih judul jika Anda mau, cukup deskriptif. dan selamat datang di stackoverflow! : D
Gordon Gustafson

Jawaban:


164

Tidak, Anda tidak dapat mengubah ukuran larik setelah dibuat. Anda juga harus mengalokasikannya lebih besar dari yang Anda kira akan Anda perlukan atau menerima biaya tambahan karena harus mengalokasikan ulang yang perlu bertambah ukurannya. Ketika itu terjadi, Anda harus mengalokasikan yang baru dan menyalin data dari yang lama ke yang baru:

int[] oldItems = new int[10];
for (int i = 0; i < 10; i++) {
    oldItems[i] = i + 10;
}
int[] newItems = new int[20];
System.arraycopy(oldItems, 0, newItems, 0, 10);
oldItems = newItems;

Jika Anda berada dalam situasi ini, saya sangat menyarankan untuk menggunakan Koleksi Java sebagai gantinya. Secara khusus ArrayListpada dasarnya membungkus sebuah larik dan menangani logika untuk menumbuhkan larik sesuai kebutuhan:

List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());

Umumnya an ArrayListadalah solusi yang lebih disukai untuk larik karena beberapa alasan. Untuk satu hal, array bisa berubah. Jika Anda memiliki kelas yang melakukan ini:

class Myclass {
    private int[] items;

    public int[] getItems() {
        return items;
    }
}

Anda telah membuat masalah karena pemanggil dapat mengubah anggota data pribadi Anda, yang mengarah ke semua jenis penyalinan defensif. Bandingkan ini dengan versi Daftar:

class Myclass {
    private List<Integer> items;

    public List<Integer> getItems() {
        return Collections.unmodifiableList(items);
    }
}

1
Daftar adalah antarmuka dan ArrayList adalah implementasinya. Membuatnya sebagai ArrayList tetapi merujuknya sebagai Daftar (sehingga dapat diubah nanti) adalah benar.
CBGraham

26

Dalam java array panjangnya tetap.

Anda dapat menggunakan List untuk menyimpan nilai dan menjalankan toArraymetode jika diperlukan. Lihat contoh berikut:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class A  {

    public static void main( String [] args ) {
        // dynamically hold the instances
        List<xClass> list = new ArrayList<xClass>();

        // fill it with a random number between 0 and 100
        int elements = new Random().nextInt(100);  
        for( int i = 0 ; i < elements ; i++ ) {
            list.add( new xClass() );
        }

        // convert it to array
        xClass [] array = list.toArray( new xClass[ list.size() ] );


        System.out.println( "size of array = " + array.length );
    }
}
class xClass {}

8

Seperti yang dikatakan orang lain, Anda tidak dapat mengubah ukuran array Java yang sudah ada.

ArrayList adalah yang terdekat dari Java standar dengan array berukuran dinamis. Namun, ada beberapa hal tentang ArrayList (sebenarnya antarmuka List) yang bukan "mirip array". Sebagai contoh:

  • Anda tidak dapat menggunakan [ ... ]untuk mengindeks daftar. Anda harus menggunakan metode get(int)dan set(int, E).
  • ArrayList dibuat dengan elemen nol. Anda tidak bisa membuat ArrayList dengan 20 elemen dan kemudian memanggil set(15, foo).
  • Anda tidak dapat langsung mengubah ukuran ArrayList. Anda melakukannya secara tidak langsung menggunakan berbagai add, insertdan removemetode.

Jika Anda menginginkan sesuatu yang lebih mirip array, Anda perlu mendesain API Anda sendiri. (Mungkin seseorang dapat bergabung dengan perpustakaan pihak ketiga yang ada ... Saya tidak dapat menemukan perpustakaan dengan 2 menit "penelitian" menggunakan Google :-))

Jika Anda hanya benar-benar membutuhkan array yang tumbuh saat Anda menginisialisasi , maka solusinya adalah seperti ini.

ArrayList<T> tmp = new ArrayList<T>();
while (...) {
    tmp.add(new T(...));
}
// This creates a new array and copies the element of 'tmp' to it.
T[] array = tmp.toArray(new T[tmp.size()]);

7

Anda mengatur jumlah elemen menjadi apa pun yang Anda inginkan pada saat Anda membuatnya:

xClass[] mysclass = new xClass[n];

Kemudian Anda dapat menginisialisasi elemen dalam satu lingkaran. Saya menduga inilah yang Anda butuhkan.

Jika Anda perlu menambahkan atau menghapus elemen ke array setelah Anda membuatnya, maka Anda harus menggunakan file ArrayList.


6

Anda dapat menggunakan ArrayList:

import java.util.ArrayList;
import java.util.Iterator;

...

ArrayList<String> arr = new ArrayList<String>();
arr.add("neo");
arr.add("morpheus");
arr.add("trinity");
Iterator<String> foreach = arr.iterator();
while (foreach.hasNext()) System.out.println(foreach.next());

3

Arrays.copyOf() Metode memiliki banyak pilihan untuk memperbaiki masalah dengan panjang Array yang meningkat secara dinamis.

API Java


Untuk lebih spesifik: if (i> = mysclass.length) mysclass = Arrays.copyOf (mysclass, i + 1); mysclass [i] = new MyClass ();
Micha Berger

2

Ya, bungkus dan gunakan kerangka kerja Koleksi.

List l = new ArrayList();
l.add(new xClass());
// do stuff
l.add(new xClass());

Kemudian gunakan List.toArray () bila perlu, atau cukup ulangi List tersebut.


2

Seperti yang dikatakan pengguna lain, Anda mungkin membutuhkan implementasi java.util.List.

Jika, karena alasan tertentu, Anda akhirnya membutuhkan sebuah array, Anda dapat melakukan dua hal:

  • Gunakan List dan kemudian konversikan menjadi array dengan myList.toArray ()

  • Gunakan larik dengan ukuran tertentu. Jika Anda membutuhkan lebih banyak atau lebih sedikit ukuran, Anda dapat memodifikasinya dengan metode java.util.Arrays.

Solusi terbaik akan bergantung pada masalah Anda;)


2

Saya merekomendasikan menggunakan vektor sebagai gantinya. Sangat mudah digunakan dan memiliki banyak metode yang telah ditentukan untuk implementasi.

import java.util.*;

Vector<Integer> v=new Vector<Integer>(5,2);

untuk menambahkan elemen cukup gunakan:

v.addElement(int);

Dalam (5,2) , 5 pertama adalah ukuran awal vektor. Jika Anda melebihi ukuran awal, vektor akan bertambah 2 tempat. Jika melebihi lagi, maka akan meningkat lagi 2 tempat dan seterusnya.


4
Kecuali Anda secara khusus membutuhkan tipe thread-safe (-ish), Anda harus menggunakan ArrayList daripada Vector.
Stephen C.

1

Di mana Anda mendeklarasikan array myclass [] sebagai:

xClass myclass[] = new xClass[10]

, cukup berikan sebagai argumen jumlah elemen XClass yang Anda perlukan. Pada saat itu apakah Anda tahu berapa banyak yang Anda butuhkan? Dengan mendeklarasikan array yang memiliki 10 elemen, Anda tidak mendeklarasikan 10 objek XClass, Anda hanya membuat array dengan 10 elemen berjenis xClass.


1

Ukuran Array Java tetap, Anda tidak dapat membuat Array dinamis seperti di C ++.


0

Ini adalah praktik yang baik untuk mendapatkan jumlah yang perlu Anda simpan terlebih dahulu kemudian menginisialisasi array.

misalnya, Anda akan menanyakan pengguna berapa banyak data yang dia perlukan untuk disimpan dan kemudian menginisialisasi, atau menanyakan komponen atau argumen berapa banyak yang perlu Anda simpan. jika Anda menginginkan array dinamis yang dapat Anda gunakan ArrayList()dan gunakan al.add();fungsi untuk terus menambahkan, maka Anda dapat mentransfernya ke array tetap.

//Initialize ArrayList and cast string so ArrayList accepts strings (or anything
ArrayList<string> al = new ArrayList(); 
//add a certain amount of data
for(int i=0;i<x;i++)
{
  al.add("data "+i); 
}

//get size of data inside
int size = al.size(); 
//initialize String array with the size you have
String strArray[] = new String[size]; 
//insert data from ArrayList to String array
for(int i=0;i<size;i++)
{
  strArray[i] = al.get(i);
}

melakukannya adalah mubazir tetapi hanya untuk menunjukkan ide kepada Anda, ArrayListdapat menyimpan objek tidak seperti tipe data primitif lainnya dan sangat mudah untuk dimanipulasi, menghapus apa pun dari tengah juga mudah, sepenuhnya dinamis. sama dengan ListdanStack


0

Saya tidak tahu apakah Anda dapat mengubah ukuran saat runtime tetapi Anda dapat mengalokasikan ukuran saat runtime. Coba gunakan kode ini:

class MyClass {
    void myFunction () {
        Scanner s = new Scanner (System.in);
        int myArray [];
        int x;

        System.out.print ("Enter the size of the array: ");
        x = s.nextInt();

        myArray = new int[x];
    }
}

ini menetapkan ukuran array Anda menjadi yang dimasukkan pada waktu proses ke x.


0

Berikut adalah metode yang tidak menggunakan ArrayList. Pengguna menentukan ukuran dan Anda dapat menambahkan loop do-while untuk rekursi.

import java.util.Scanner;
    public class Dynamic {
        public static Scanner value;
        public static void main(String[]args){
            value=new Scanner(System.in);
            System.out.println("Enter the number of tests to calculate average\n");
            int limit=value.nextInt();
            int index=0;
            int [] marks=new int[limit];
            float sum,ave;
            sum=0;      
            while(index<limit)
            {
                int test=index+1;
                System.out.println("Enter the marks on test " +test);
                marks[index]=value.nextInt();
                sum+=marks[index];
                index++;
            }
            ave=sum/limit;
            System.out.println("The average is: " + ave);
        }
    }

0

Di Java Array Sizes selalu dari Fixed Length Tetapi ada cara di mana Anda dapat secara dinamis meningkatkan Ukuran Array saat Runtime Itu Sendiri

Ini adalah cara yang paling "digunakan" dan juga disukai untuk melakukannya-

    int temp[]=new int[stck.length+1];
    for(int i=0;i<stck.length;i++)temp[i]=stck[i];
    stck=temp;

Dalam kode di atas kita menginisialisasi array temp [] baru, dan selanjutnya menggunakan loop for untuk menginisialisasi konten temp dengan konten array asli yaitu. stck []. Dan kemudian menyalinnya kembali ke aslinya, memberi kita array baru SIZE.

Tidak diragukan lagi ini menghasilkan Overhead CPU karena menginisialisasi ulang array menggunakan for loop berulang kali. Tapi Anda masih bisa menggunakan dan menerapkannya di kode Anda. Untuk praktik terbaik, gunakan "Daftar Tertaut" daripada Array, jika Anda ingin data disimpan secara dinamis dalam memori, dengan panjang variabel.

Berikut adalah Contoh Real-Time berdasarkan Dynamic Stacks untuk MENINGKATKAN UKURAN ARRAY pada Run-Time

Nama file: DStack.java

public class DStack {
private int stck[];
int tos;

void Init_Stck(int size) {
    stck=new int[size];
    tos=-1;
}
int Change_Stck(int size){
    return stck[size];
}

public void push(int item){
    if(tos==stck.length-1){
        int temp[]=new int[stck.length+1];
        for(int i=0;i<stck.length;i++)temp[i]=stck[i];
        stck=temp;
        stck[++tos]=item;
    }
    else
        stck[++tos]=item;
}
public int pop(){
    if(tos<0){
        System.out.println("Stack Underflow");
        return 0;
    }
    else return stck[tos--];
}

public void display(){
    for(int x=0;x<stck.length;x++){
        System.out.print(stck[x]+" ");
    }
    System.out.println();
}

}

File-name: Exec.java
(dengan kelas utama)

import java.util.*;
public class Exec {

private static Scanner in;

public static void main(String[] args) {
    in = new Scanner(System.in);
    int option,item,i=1;
    DStack obj=new DStack();
    obj.Init_Stck(1);
    do{
        System.out.println();
        System.out.println("--MENU--");
        System.out.println("1. Push a Value in The Stack");
        System.out.println("2. Pop a Value from the Stack");
        System.out.println("3. Display Stack");
        System.out.println("4. Exit");
        option=in.nextInt();
        switch(option){
        case 1:
            System.out.println("Enter the Value to be Pushed");
            item=in.nextInt();
            obj.push(item);
            break;
        case 2:
            System.out.println("Popped Item: "+obj.pop());
            obj.Change_Stck(obj.tos);
            break;
        case 3:
            System.out.println("Displaying...");
            obj.display();
            break;
        case 4:
            System.out.println("Exiting...");
            i=0;
            break;
        default:
            System.out.println("Enter a Valid Value");

        }
    }while(i==1);

}

}

Semoga ini menyelesaikan pertanyaan Anda.


0

Ya, kita bisa melakukannya dengan cara ini.

import java.util.Scanner;

public class Collection_Basic {

    private static Scanner sc;

    public static void main(String[] args) {

        Object[] obj=new Object[4];
        sc = new Scanner(System.in);


        //Storing element
        System.out.println("enter your element");
        for(int i=0;i<4;i++){
            obj[i]=sc.nextInt();
        }

        /*
         * here, size reaches with its maximum capacity so u can not store more element,
         * 
         * for storing more element we have to create new array Object with required size
         */

        Object[] tempObj=new Object[10];

        //copying old array to new Array

        int oldArraySize=obj.length;
        int i=0;
        for(;i<oldArraySize;i++){

            tempObj[i]=obj[i];
        }

        /*
         * storing new element to the end of new Array objebt
         */
        tempObj[i]=90;

        //assigning new array Object refeence to the old one

        obj=tempObj;

        for(int j=0;j<obj.length;j++){
            System.out.println("obj["+j+"] -"+obj[j]);
        }
    }


}

0

Karena ArrayList membutuhkan banyak memori ketika saya membutuhkan array tipe primitif, saya lebih suka menggunakan IntStream.builder () untuk membuat array int (Anda juga dapat menggunakan pembangun LongStream dan DoubleStream).

Contoh:

Builder builder = IntStream.builder();
int arraySize = new Random().nextInt();
for(int i = 0; i<arraySize; i++ ) {
    builder.add(i);
}
int[] array = builder.build().toArray();

Catatan: tersedia sejak Java 8.


0

Anda bisa melakukan sesuatu

private  static Person []  addPersons(Person[] persons, Person personToAdd) {
    int currentLenght = persons.length;

    Person [] personsArrayNew = Arrays.copyOf(persons, currentLenght +1);
    personsArrayNew[currentLenght]  = personToAdd;

    return personsArrayNew;

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.