Làm cách nào để thêm động các mục vào một mảng Java?


85

Trong PHP, bạn có thể thêm động các phần tử vào mảng bằng cách sau:

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

Sau đó, $xsẽ là một mảng như thế này: {1,2}.

Có cách nào để làm điều gì đó tương tự trong Java không?


4
Đối với tất cả các câu trả lời dưới đây sử dụng ArrayList nhưng OP yêu cầu cụ thể về Array. tôi cũng muốn biết.
KJYe.Name 葉家仁

4
câu trả lời là 'Không'. Bạn phải chỉ định kích thước của mảng (hoặc điền tất cả các phần tử) tại thời điểm khai báo / tạo trong Java. Vui lòng xem java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh

Tôi nhận thấy rằng các mảng trả về hàm Java khác nhau, vì vậy hãy xem việc triển khai danh sách (bộ lọc) trong File.java. Nó sử dụng một Danh sách nội bộ và sau đó chuyển đổi nó thành một mảng ở cuối. Danh sách <Chuỗi> v = new ArrayList <> (); ... return v.toArray (new String [v.size ()]);
xtempore

Câu trả lời:


112

Nhìn vào java.util.LinkedList hoặc java.util.ArrayList

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

21
Đây là một câu trả lời hoàn hảo ngoại trừ một mảnh. Thông thường trong Java, chúng ta chỉ sử dụng List's thay vì các mảng nguyên thủy, nhưng đối với các trường hợp bạn thực sự cần một mảng nguyên thủy (như int[]) chỉ cần sử dụng toArray()phương thức trên List. Sử dụng đoạn mã trên nhưng sử dụng x.toArray()để lấy một Mảng nguyên thủy.
rharter

1
Trong 99% trường hợp (giống như 99,99999% trường hợp) nếu bạn thực sự cần một mảng nguyên thủy, bạn đang làm sai điều gì đó và nó phải được xử lý bằng các nguyên tắc OO. Trừ khi bạn đang giao tiếp với mã gốc, hoặc một cái gì đó giống như ARRAYcác đối tượng Oracle hoặc một số điều tương tự như vậy, tốt hơn hết bạn nên tránh các mảng nguyên thủy.
corsiKa

11
oh, tất cả những ý kiến về cách bạn không nên sử dụng các mảng nguyên thủy, nếu chỉ có nó là dễ dàng :(
thecoshman

1
@trusktr Đó là một lý do để làm điều đó. Trong ví dụ này, nó dọc theo dòng ... sử dụng một Listtham chiếu cho phép chúng ta lao ArrayListvào lề đường bất cứ lúc nào chúng ta muốn. Nếu ai đó phát hành một danh sách tốt hơn, chẳng hạn như SuperDuperAwesomeList, chúng tôi có thể còn nhiều việc phải làm nếu chúng tôi thực hiện tham chiếu của mình là một ArrayList. ArrayList có những thứ mà List không có. Nếu chúng ta dựa vào những thứ đó trong mã của mình, việc hoán đổi trở nên khó khăn hơn nhiều.
corsiKa

1
@corsiKa, viết một số thuật toán nén / mã hóa mà không có nguyên thủy và những trường hợp đó phổ biến hơn rất nhiều so với 99. (9). Маtrix impls cũng hét lên linh hoạt. Một lưu ý là nếu bạn tương tác với mã gốc, bạn sử dụng Bộ đệm trực tiếp chứ không phải mảng nguyên thủy. Cuối cùng thì ai đó cũng phải kinh ngạc, nếu bạn bị mắc kẹt với cơ sở dữ liệu và trình bày, thì không sao nhưng tuyên bố 99% chỉ là ngớ ngẩn.
bestsss

64

Mảng trong Java có kích thước cố định, vì vậy bạn không thể "thêm thứ gì đó vào cuối" như cách bạn có thể làm trong PHP.

Một chút tương tự với hành vi PHP là:

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

Sau đó, bạn có thể viết:

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

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

Nhưng lược đồ này không hiệu quả một cách khủng khiếp đối với các mảng lớn hơn , vì nó tạo ra một bản sao của toàn bộ mảng mỗi lần. (Và trên thực tế nó không hoàn toàn tương đương với PHP, vì các mảng cũ của bạn vẫn giữ nguyên).

Các mảng PHP trên thực tế khá giống với một Java HashMap với một "khóa tối đa" được thêm vào, vì vậy nó sẽ biết khóa nào sẽ sử dụng tiếp theo và một thứ tự lặp lạ (và mối quan hệ tương đương kỳ lạ giữa các khóa Số nguyên và một số Chuỗi). Nhưng đối với các bộ sưu tập được lập chỉ mục đơn giản, tốt hơn nên sử dụng Danh sách bằng Java, giống như những người trả lời khác đã đề xuất.

Nếu bạn muốn tránh sử dụng Listdo chi phí phải gói mọi int trong một Số nguyên, hãy xem xét sử dụng việc thực hiện lại các bộ sưu tập cho các kiểu nguyên thủy, sử dụng mảng bên trong, nhưng sẽ không sao chép mọi thay đổi, chỉ khi mảng bên trong đầy ( giống như ArrayList). (Một ví dụ nhanh chóng được googled là lớp IntList này .)

Ổi chứa các phương pháp tạo giấy gói như vậy trong Ints.asList, Longs.asListvv


nó thông minh hơn nhiều so với giải pháp được chấp nhận. không có đồ vật lãng phí.
mist

2
@Mihail: Thực ra, tôi thường không khuyên bạn làm điều này, vì đối với mỗi lần thêm phần tử, một mảng mới được tạo và toàn bộ nội dung được sao chép. (Nó phụ thuộc vào trường hợp sử dụng của bạn, mặc dù - nếu bạn hiếm khi thêm / loại bỏ bất cứ điều gì, và thường lặp / tìm kiếm, nó có thể là okay.)
Paulo Ebermann

ArrayUtils trong các phiên bản mới hơn có phương thức thực hiện điều đó. Tôi khá lười kiểm tra việc triển khai, nhưng tôi khá chắc chắn rằng họ đã viết nó tốt.
mist

1
@MihailStoynov Trên thực tế, về cơ bản đây là những gì ArrayList- ngoại trừ việc thay vì thay đổi kích thước trên mỗi lần bổ sung, khi hết chỗ, nó tăng gấp đôi kích thước để không phải thay đổi kích thước gần như thường xuyên.
corsiKa

1
@Mav Không, vì orgngắn hơn result.
Paŭlo Ebermann

19

Apache Commons có triển khai ArrayUtils để thêm một phần tử vào cuối mảng mới:

/** 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
Trong ArrayUtils mới hơn đó là: ArrayUtils.appendElement (String.class, origArray, "yếu tố mới")
marmor

12

Tôi đã thấy câu hỏi này rất thường xuyên trên web và theo ý kiến ​​của tôi, nhiều người có uy tín cao đã không trả lời những câu hỏi này một cách chính xác. Vì vậy, tôi xin bày tỏ câu trả lời của riêng tôi ở đây.

Trước tiên, chúng ta nên xem xét có sự khác biệt giữa arrayarraylist.

Câu hỏi đặt ra yêu cầu bổ sung thêm một yếu tố để một mảng , và không ArrayList


Câu trả lời khá đơn giản. Nó có thể được thực hiện trong 3 bước.

  1. Chuyển đổi mảng thành một danh sách mảng
  2. Thêm phần tử vào arrayList
  3. Chuyển đổi lại arrayList mới thành mảng

Đây là hình ảnh đơn giản của nó nhập mô tả hình ảnh ở đây

Và cuối cùng đây là đoạn mã:

Bước 1:

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

Bước 2:

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

            list.add(element);
            return list;
    }

Bước 3:

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

Bước 4

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

1
Được ủng hộ vì cuối cùng ai đó đã gọi ra sự khác biệt giữa mảng thực tế và ArrayList ...
JoeG

Câu trả lời đầy đủ và mô tả nhất.
Obaid

11

Bạn có thể sử dụng một ArrayListvà sau đó sử dụng toArray()phương pháp. Nhưng tùy thuộc vào những gì bạn đang làm, bạn thậm chí có thể không cần một mảng nào cả. Xem xét xem Listscó nhiều hơn những gì bạn muốn.

Xem: Hướng dẫn Danh sách Java



4

Bạn có thể thêm động các phần tử vào một mảng bằng cách sử dụng Khung Bộ sưu tập trong JAVA. collection Framework không hoạt động trên các kiểu dữ liệu nguyên thủy.

Khung Bộ sưu tập này sẽ có sẵn trong gói "java.util. *"

Ví dụ: nếu bạn sử dụng ArrayList,

Tạo một đối tượng cho nó và sau đó thêm số phần tử (bất kỳ loại nào như Chuỗi, Số nguyên ... vv)

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

Bây giờ bạn đã được thêm 3 phần tử vào một mảng.

nếu bạn muốn loại bỏ bất kỳ yếu tố nào đã thêm

a.remove("suman");

một lần nữa nếu bạn muốn thêm bất kỳ phần tử nào

a.add("Gurram");

Vì vậy, kích thước mảng đang tăng / giảm động ..


1

Sử dụng ArrayList hoặc sắp xếp các mảng để tự động tăng kích thước mảng.


0

giữ số lượng bạn đang ở đâu trong mảng nguyên thủy

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

Điều này thực sự không liên quan gì đến câu hỏi ban đầu về việc liệu có thể nối động các mục mới vào một mảng nguyên thủy Java hay không.
Ngày của Joe, ngày

0

Đây là một cách đơn giản để thêm vào một mảng trong java. Tôi đã sử dụng một mảng thứ hai để lưu trữ mảng ban đầu của mình, sau đó thêm một phần tử nữa vào nó. Sau đó, tôi chuyển mảng đó trở lại mảng ban đầu.

    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

Trong Java kích thước của mảng là cố định, nhưng bạn có thể thêm động các phần tử vào một mảng có kích thước cố định bằng cách sử dụng chỉ mục của nó và vòng lặp for. Vui lòng tìm ví dụ dưới đây.

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.