xClass의 배열에로드하려는 클래스-xClass가 있으므로 선언합니다.
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
그러나 10 개가 필요한지 모르겠습니다. 그 문제에 대해 8 개 또는 12 개 또는 다른 번호가 필요할 수 있습니다. 런타임까지 알 수 없습니다. 배열의 요소 수를 즉시 변경할 수 있습니까? 그렇다면 어떻게?
답변
아니요, 일단 생성 된 배열의 크기는 변경할 수 없습니다. 필요하다고 생각하는 것보다 더 크게 할당하거나 크기를 늘리기 위해 재 할당해야하는 오버 헤드를 수용해야합니다. 그렇다면 새 데이터를 할당하고 이전 데이터를 새 데이터로 복사해야합니다.
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;
이 상황에 처해 있다면 Java Collections를 대신 사용하는 것이 좋습니다. 특히 ArrayList
기본적으로 배열을 래핑하고 필요에 따라 배열을 늘리는 논리를 처리합니다.
List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());
일반적으로는 ArrayList
여러 가지 이유로 배열에 대한 바람직한 솔루션입니다. 우선, 배열은 변경 가능합니다. 이 작업을 수행하는 클래스가있는 경우 :
class Myclass {
private int[] items;
public int[] getItems() {
return items;
}
}
호출자가 개인 데이터 구성원을 변경할 수 있으므로 모든 종류의 방어적인 복사로 이어질 수 있으므로 문제가 발생했습니다. 이것을 목록 버전과 비교하십시오.
class Myclass {
private List<Integer> items;
public List<Integer> getItems() {
return Collections.unmodifiableList(items);
}
}
답변
자바에서는 배열 길이가 고정되어 있습니다.
List를 사용하여 값을 보유하고 toArray
필요한 경우 메소드를 호출 할 수 있습니다 . 다음 샘플을 참조하십시오.
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 {}
답변
다른 사람들이 말했듯이 기존 Java 배열의 크기를 변경할 수 없습니다.
ArrayList는 표준 Java가 동적 크기 배열에 가장 가깝습니다. 그러나 “배열과 유사”하지 않은 ArrayList (실제로는 List 인터페이스)에 대한 몇 가지 사항이 있습니다. 예를 들면 :
[ ... ]
목록을 색인화하는 데 사용할 수 없습니다 .get(int)
및set(int, E)
메서드 를 사용해야합니다 .- 0 요소로 ArrayList가 작성됩니다. 20 개의 요소로 ArrayList를 생성 한 다음 호출 할 수는 없습니다.
set(15, foo)
. - ArrayList의 크기를 직접 변경할 수 없습니다. 당신은 간접적으로 다양한 사용하여 그것을 할
add
,insert
그리고remove
방법을.
좀 더 배열과 같은 것을 원한다면 고유 한 API를 설계해야합니다. (아마도 누군가가 기존의 타사 라이브러리에 차임 할 수 있습니다. Google을 사용하여 2 분 동안 “연구”하는 라이브러리를 찾을 수 없습니다. :-))
초기화 할 때 증가하는 배열 만 필요한 경우 솔루션은 다음과 같습니다.
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()]);
답변
요소 수를 만들 때 원하는 항목으로 설정합니다.
xClass[] mysclass = new xClass[n];
그런 다음 루프에서 요소를 초기화 할 수 있습니다. 나는 이것이 당신이 필요하다고 생각합니다.
배열을 만든 후 배열에 요소를 추가하거나 제거해야하는 경우 ArrayList
.
답변
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());
답변
Arrays.copyOf()
메서드에는 배열 길이가 동적으로 증가하는 문제를 해결하는 많은 옵션이 있습니다.
답변
예, 래핑하고 Collections 프레임 워크를 사용합니다.
List l = new ArrayList();
l.add(new xClass());
// do stuff
l.add(new xClass());
그런 다음 필요한 경우 List.toArray ()를 사용하거나 해당 List를 반복합니다.