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를 사용한 다음 끝에 배열로 변환합니다. 목록 <문자열> v = 새 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

1
99 %의 경우 (99.99999 %의 경우) 실제로 원시 배열이 필요한 경우 잘못된 작업을하고 있으며 OO 원칙으로 처리해야합니다. 네이티브 코드 나 Oracle ARRAY객체 또는 이와 같은 멍청함과 상호 작용하지 않는 한 기본 배열을 피하는 것이 훨씬 낫습니다.
corsiKa

11
오, 원시 배열을 어떻게 사용하지 말아야하는지에 대한이 모든 의견은 그렇게 쉬웠다면 :(
thecoshman

1
@trusktr 그것이 그것을하는 한 가지 이유입니다. 이 예에서는 ... List참조를 사용하면 ArrayList원할 때 언제든지 연석으로 이동할 수 있습니다. 누군가가 더 나은 목록 (예 :)을 공개하면 SuperDuperAwesomeList참조를 ArrayList. ArrayList에는 List에없는 것이 있습니다. 우리 코드에서 이러한 것들에 의존하면 교체하기가 훨씬 더 어려워집니다.
corsiKa 2013 년

1
@corsiKa, 프리미티브없이 압축 / 인코딩 알고리즘을 작성하고 이러한 경우는 99보다 훨씬 더 일반적입니다. (9). Маtrix는 primitiv도 비명을 지 릅니다. 참고로 원시 코드와 상호 작용하는 경우 원시 배열이 아닌 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를 사용하는 것이 좋습니다.

ListInteger의 모든 int를 래핑하는 오버 헤드로 인해 사용을 피하려면 내부 배열을 사용하지만 내부 배열이 가득 찬 경우에만 모든 변경 사항에 대해 복사하지 않는 기본 유형에 대한 컬렉션의 재 구현 사용을 고려하십시오. ArrayList처럼). (빠르게 봤던 한 가지 예는 이 IntList 클래스 입니다.)

구아바 포함 같은 래퍼 만드는 방법 에서 Ints.asList, Longs.asList


허용되는 솔루션보다 훨씬 더 똑똑합니다. 낭비되는 물건이 없습니다.
안개

2
@Mihail : 실제로는 요소를 추가 할 때마다 새 배열이 생성되고 전체 내용이 복사되므로 일반적으로이 작업을 권장하지 않습니다. (사용 사례에 따라 다르지만 추가 / 제거가 거의없고 자주 반복 / 검색하는 경우 괜찮을 수 있습니다.)
Paŭlo Ebermann

최신 버전의 ArrayUtils에는이를 수행하는 방법이 있습니다. 나는 구현을 확인하기가 꽤 게으르지 만 그들이 그것을 잘 작성했다고 확신합니다.
안개 낀

1
@MihailStoynov 사실, 이것은 본질적으로하는 일입니다. ArrayList단, 추가 할 때마다 크기를 조정하는 대신 공간이 부족할 때 크기가 두 배가되므로 자주 크기를 조정할 필요가 없습니다.
corsiKa

1
@Mav 아니, 있기는 org하나 이상의 짧다 result.
Paŭlo 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

저는이 질문을 웹에서 자주 보았고 제 생각에는 평판이 좋은 많은 사람들이이 질문에 적절하게 대답하지 않았습니다. 그래서 여기에 제 답을 표현하고 싶습니다.

먼저 와 사이 에 차이 가 있음을 고려해야 합니다.arrayarraylist

질문 요소를 추가하기위한 요청 어레이에하지의 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

가장 완전하고 설명적인 답변입니다.
오바 이드

11

ArrayList를 사용한 다음 toArray()방법 을 사용할 수 있습니다 . 그러나 수행중인 작업에 따라 어레이가 전혀 필요하지 않을 수도 있습니다. 경우보고에 봐 Lists더 당신이 원하는 무엇인가.

참조 : Java List Tutorial



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 기본 배열에 새 항목을 동적으로 추가 할 수 있는지 여부에 대한 원래의 질문과 실제로 관련이 없습니다.
Joe Day

0

이것은 Java에서 배열에 추가하는 간단한 방법입니다. 두 번째 배열을 사용하여 원래 배열을 저장 한 다음 요소를 하나 더 추가했습니다. 그 후 그 배열을 원래 배열로 다시 전달했습니다.

    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.