배열 목록의 배열 만들기


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.