2012-12-03 1 views
0

각 요소가 (특정 개체의) LinkedList에 해당하는 큰 행렬 (nxn)을 만들고 싶습니다.더 효율적이고 컴팩트 한 것 : 연결 목록 변수 또는 각각을 포함하는 2 차원 arraylist의 거대한 집합?

I 중 하나를 수행 할 수 있습니다

  1. n 개의 * n 개의 개별 링크 된 목록을 작성하고 루프 내 평가()의 도움으로 그 이름을 그 두 차원을 반복 (또는 비슷한), 점에서 그렇게 end 나는 LinkedList_1_1, LinkedList_1_2 등을 가질 것이다. 각 변수에는 고유 한 변수 이름이있다. 기본적으로 행렬을 모두 건너 뜁니다.

  2. ArrayList의 ArrayList를 만든 다음 각 요소에 연결된 목록을 밀어 넣습니다. 내가 시간을 & 공간을 절약하고, 편의성 액세스 내 나중에 코드에서, 나는 개별 LinkedList들을 참조 할 때 할 경우

나에게 방법을 권장 해주십시오. 방법 1을 사용하면 특정 연결 목록에 액세스 할 때마다 eval을 사용해야하므로 사용 편의성이 떨어집니다.

내 감정은 방법 2가 가장 좋은 방법이라고 생각하지만 내 초기화를 어떻게 정확하게 형성 할 수 있습니까?

답변

1

처음부터 크기를 알기 때문에 배열을 사용하는 것이 어떻습니까? 불행하게도 자바 제네릭은 구체적인 제네릭 형식되는 것을 배열 요소 자체를 방지 할 수 있지만 와일드 카드 사용할 수 있습니다 : 메모리에

LinkedList<?>[][] lists = new LinkedList<?>[n][n]; 

또는 약간보다 효율적으로, 단 하나의 배열 :

LinkedList<?>[] lists = new LinkedList<?>[n * n]; 

// Then for access... 
lists[y * n + x] = ...; 

을 그런 다음 각 액세스에 캐스트해야합니다 (항상 캡슐화한다고 가정하면 @SuppressWarnings을 사용합니다). 나는 하나의 장소에 그것을 넣어 것 : 물론

@SuppressWarnings("unchecked") 
private LinkedList<Foo> getList(int x, int y) { 
    if (lists[y][x] == null) { 
     lists[y][x] = new LinkedList<Foo>(); 
    } 
    // Cast won't actually have any effect at execution time. It's 
    // just to tell the compiler we know what we're doing. 
    return (LinkedList<Foo>) lists[y][x]; 
} 

당신이 다음에 필요 경우 빈 연결리스트 로 배열을 채울 필요 했어 두 경우 모두에서. 연결된 목록 중 몇 개가 노드를 가지지 않는 경우 지연을 채우는 것만 고려하십시오.

확실히은 수백 개의 변수가있는 클래스를 생성하지 않습니다. 목록에 대한 프로그래밍 방식의 액세스는 매우 고통스럽고 기본적으로 여러 가지 방법으로 나쁜 아이디어가됩니다.

+0

연결된 목록을 저장하기 위해 일반 배열을 사용할 수 있다는 것을 알지 못했습니다. 감사합니다. –

+0

@WuschelbeutelKartoffelhuhn : 실제로이 문제가 발생합니다. 편집 중. –

+0

@WhelhelbeutelKartoffelhuhn : 편집을 참조하십시오. 약간 못 생겼지 만 기본적으로 원하는 결과를 얻습니다. –

관련 문제