배열 목록의 배열 만들기


175

아래와 같이 arraylist 배열을 만들고 싶습니다.

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]

그러나 컴파일되지 않습니다. 어떻게해야합니까?


8
배열과 컬렉션을 혼합하지 마십시오. 사실, 프리미티브를 다루지 않거나 (무엇을하고 있는지 알지 못한다면) 배열을 사용하지 마십시오. 배열은 유용성 악몽이며 코드를 유지할 수 없게 만듭니다.
Sean Patrick Floyd

13
@SeanPatrickFloyd 왜 어레이가 유용성 악몽인지 설명 할 수 있습니까?
사용자

3
@crucifiedsoul 확실합니다. 배열을 확장 할 수없고 배열에 아무것도 삽입 할 수 없으며 배열은 equals hashcode 또는 toString 등과 같은 표준 메소드를 재정의하지 않습니다.
Sean Patrick Floyd

9
@SeanPatrickFloyd 괜찮아요-정확히 4 개의 배열 목록이 필요합니다-인덱스별로 각 항목에 액세스 할 계획입니다-외부 배열이 필요하지 않습니다. 증가 또는 축소-toString 또는 해시 코드 등이 필요하지 않습니다. -나에게 배열은 명백한 선택입니다.이 상황에서 대안으로 무엇을 추천 하시겠습니까?
BrainSlugs83

4
좋아, 이것은 오래된 질문이지만 어쨌든 물어보고 누군가 대답하는지 볼 것입니다. 모든 사람들이 왜 목록 배열이 끔찍한 아이디어, 나쁜 코딩 연습 등인지 이야기하고 있습니다. 해시 체인을 배우는 것을 배우기 때문에 이것을 찾았습니다. 해시 체인의 정의 는 목록의 배열입니다! 그렇다면 어떻게 중앙 프로그래밍 데이터 구조가 끔찍한 코딩 방법이 될 수 있을까요? 아니면 @Sean이 언급 한 IYKWYD 범주에 속합니까?
jimboweb

답변:


142

당으로 오라클 문서 :

"매개 변수화 된 유형의 배열을 작성할 수 없습니다"

대신, 당신은 할 수 있습니다 :

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

Tom Hawting이 제안한 것처럼 tackline은 다음과 같이하는 것이 좋습니다.

List<List<Individual>> group = new ArrayList<List<Individual>>(4);

20
List<List<Individual>> group = new ArrayList<List<Individual>>();아마 더 나을 것입니다.
Tom Hawtin-tackline

4
"제네릭 형식의 배열을 만들 수 없습니다"는 무엇을 의미합니까? 그것은 당신이 가지고 있다고 생각하는 것을 제공한다면 일반적인 것이 아니기 때문에 실제로 이해가되지 않습니다.
Andy

5
나는 질문에 대답하지 않기 때문에 공감 율이 놀랍습니다 (즉, 어떻게하고 싶습니까, 어떻게 할 수 있습니까). 첫 번째 문장을 제외하고.
Florian F

15
왜 List 참조가 ArrayList보다 낫습니까?
시푸

3
@shifu List 참조는 ArrayList보다 일반적입니다. List로 선언하면 List API를 넘어 확장되는 ArrayList의 API가 추상화됩니다. 그것은 ArrayList가 가지고있는 여분의 참조로 API를 어지럽히 지 않고 API가 List에 필요한 모든 것을 가지고있는 List에 대한 참조를 단순화하기 때문에 좋습니다. 참조를 통해 사용 가능한 API의 특정 항목이 필요한 경우에만 ArrayList로 선언해야합니다.
cellepo

98

다른 사람들이 언급했듯이 다른 목록을 사용하여 ArrayList를 저장하는 것이 더 좋지만 배열을 사용해야하는 경우 :

ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

4
아무도 왜 내가 위의 스 니펫을 좋아하는지 잘 설명하지 못하는 것 같습니다. 왜 이것보다 list를 사용하는 것이 좋습니다?
clankill3r

3
배열 그룹 이 변경되지 않으면 배열이 List <> 클래스보다 빠르기 때문에이 방법이 더 좋습니다.
Borzh

33
실제로 질문에 답변 해 주셔서 감사합니다. 추가 컨텍스트없이 목록을 목록으로 자동 가정하는 논리적 인 이유는 없습니다.
특별 소스

3
@kelvincer 답변 ( ArrayList<String>[] group = new ArrayList[4]) 보다 선호되는 이유는 무엇입니까? 캐스트는 무엇을 더 잘합니까?
cellepo

2
new ArrayList<?>[N]원시 유형을 사용하지 않도록 사용해야 합니다.
Radiodef

80

이것은 작동합니다 :

ArrayList<String>[] group = new ArrayList[4];

1
이것은 문자열 이외의 다른 객체의 ArrayList를 추가 (예 : ArrayList<String>대신 대신 ArrayList<NotString>)하여 group컴파일하지 않는 바람직한 이점을 가지고 있습니다.
cellepo

12
경고가 발생합니다.Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
math

24

ArrayList를 확장하는 클래스를 만들 수 있습니다

class IndividualList extends ArrayList<Individual> {

}

그런 다음 배열을 만듭니다

IndividualList[] group = new IndividualList[10];

17

나는 그것을 완전히 이해하지 못한다. 왜 모든 사람들 이이 질문에 대해 배열에 대해 일반적 유형을 제안하고 있는지.

n다른 배열 목록 을 색인화해야하는 경우 어떻게해야합니까?

선언하면 객체를 수동으로 List<List<Integer>>만들 n ArrayList<Integer>거나 for 루프를 사용하여 n목록이나 다른 방법 을 만들 필요가 있습니다 . 어쨌든 항상 n목록 을 만드는 것이 내 의무 입니다.

캐스팅을 통해로 선언하면 좋지 않습니다 List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. 나는 모든 색인 객체 (배열 목록)를 스스로 만들 필요가없는 좋은 디자인으로 본다.

왜 이것이 (어레이 폼) 나쁜 디자인이고 그 단점이 무엇인지 깨달을 수 있습니까?


AFAICT는 자바가 테이블에 가져 오는 끔찍한 타이핑 시스템에 의해 유도 된 일종의화물 컬트 정신입니다.
BrainSlugs83

@ smsIce : 나쁜 디자인이 아닙니다. 문제는 많은 작가들이 전체 질문을 읽거나 명확하게 이해하지 못한다는 것입니다.
testo

16

ArrayList의 배열을 만들 수 있습니다

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

이것은 이와 같은 시나리오에서 도움이 될 것입니다. 당신은 외부의 크기를 알고 있습니다. 그러나 내면의 크기는 다양합니다. 여기에서 크기가 다양한 배열 목록을 포함하는 고정 길이의 배열을 만들 수 있습니다. 이것이 당신에게 도움이되기를 바랍니다.

에서 자바 8 이상 당신은 더 나은 방법으로 할 수 있습니다.

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

메소드 참조를 사용 하는 것이 더 좋습니다.

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);

2
를 사용할 때 ArrayList (1), ArrayList (2), ArrayList (3) 등의 인수로 현재 색인 을 사용하여 생성자를 ArrayList::new호출합니다 ArrayList(int). 따라서 크기가 작거나 너무 큰 배열로 끝납니다. 사용법에 따라. 나는 그것을 사용하지 말고 대신 람다 식에서 생성자를 직접 호출하는 두 번째 방법을 선호합니다.
Genhis

8

이것은 ArrayList의 배열로 작동합니다. 그것이 어떻게 작동하는지 이해하려고 노력하십시오.

import java.util.*;

public class ArrayOfArrayList {
    public static void main(String[] args) {

        // Put the length of the array you need
        ArrayList<String>[] group = new ArrayList[15];
        for (int x = 0; x < group.length; x++) {
            group[x] = new ArrayList<>();
        }

        //Add some thing to first array
        group[0].add("Some");
        group[0].add("Code");

        //Add some thing to Secondarray
        group[1].add("In here");

        //Try to output 'em
        System.out.println(group[0]);
        System.out.println(group[1]);
    }
}

일부 코드는 Kelvincer에게 제공합니다.


6

이 상황의 문제점은 arraylist를 사용하여 특정 위치에 추가하기 위해 시간 복잡도 o (n)을 얻는 것입니다. 배열을 사용하는 경우 배열을 선언하여 메모리 위치를 작성하므로 일정합니다.


특정 위치에 추가하는 것은 array 및 ArrayList 모두에 대해 O (n)입니다. 채우기는 배열과 ArrayList 모두에 대해 O (n)입니다.
Navin

2
특정 위치에 추가하는 것은 배열의 경우 O (1)입니다. ArrayList의 경우 O (n)이지만 배열의 경우 O (1)입니다.
aviemet

3

제네릭 형식의 배열을 만들 수 없습니다. ArrayList 목록 만들기 :

 List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();

또는 배열이 정말로 필요한 경우 (경고 : 잘못된 디자인!) :

 ArrayList[] group = new ArrayList[4];

2
  1. 작성 및 초기화

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. 쓰기 권한

    yourArray[i]= someArrayList;

    내부 ArrayList의 요소에 액세스하려면 :

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. 읽기 권한

    배열 요소 i를 ArrayList로 읽으려면 유형 캐스팅을 사용하십시오.

    someElement= (ArrayList<YourType>) yourArray[i];

    배열 요소 i의 경우 : 인덱스 j에서 ArrayList 요소 읽기

    arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);

2

List [] listArr = 새 배열 목록 [4];

위의 줄은 warning을 제공하지만 작동합니다 (즉, ArrayList의 Array를 만듭니다)


1

Sprite 위치를 Points로 정적으로 ArrayLists의 배열을 선언하려면 :

ArrayList<Point>[] positionList = new ArrayList[2];

public Main(---) {
    positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
    positionList[1] = new ArrayList<Point>();
}

동적으로 :

ArrayList<Point>[] positionList;
int numberOfLists;

public Main(---) {
    numberOfLists = 2;
    positionList = new ArrayList[numberOfLists];
    for(int i = 0; i < numberOfLists; i++) {
        positionList[i] = new ArrayList<Point>();
    }
}

주의 사항과 복잡한 제안에도 불구하고 ArrayLists 배열은 동일한 유형의 관련 ArrayLists를 나타내는 우아한 솔루션이라는 것을 알았습니다.


1
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10]; 

1

이렇게 만들 수 있습니다 ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

제네릭이 아닌 형식의 배열을 만든 다음 제네릭 형식으로 캐스팅해야합니다.


1

ArrayList<Integer>[] graph = new ArrayList[numCourses] 효과가있다.


0

사용하기가 더 쉽다는 것을 알았습니다 ...

static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
 group=new ArrayList[size];
 for(int i=0;i<size;i++)
 {
  group[i]=new ArrayList<Individual>();
 }

0

당신은 이것을 할 수 있습니다 :

// ArrayList 유형의 배열 만들기

`ArrayList<Integer>[] a = new ArrayList[n];`

// 배열의 각 요소에 대해 ArrayList를 만듭니다.

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}

0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}

-1

List []를 만들고 for 루프로 초기화 할 수 있습니다. 오류없이 컴파일됩니다.

List<e>[] l;
for(int i = 0; i < l.length; i++){
    l[i] = new ArrayList<e>();
}

arrayList [] l에서도 작동합니다.


2
l.lengthfor-loop에는 정의되어 있지 않습니다. 런타임 오류 일 수 있습니다.
bourbaki4481472

l은 길이를 갖도록 초기화되지 않았으며, for 루프에 도달 할 때 여전히 널 포인터입니다. 즉, List <e> [] l = 새 목록 [LENGTH];
Erik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.