2011-11-07 2 views
3

자바의 적절한 데이터 구조로 매트릭스와 같은 데이터를 표현하고 싶습니다. 이 행렬의 크기는 사용자 입력에 따라 다릅니다. 한 가지 방법은 아마 "magic"max-constant를 사용하고 간단한 다차원 배열을 사용하는 것입니다. 그러나 데이터에 대한 연산은 차원에 크게 의존하며 고정 배열을 사용하지 않으려합니다. 왜냐하면 항상 사용 된 대 최대 차원을 추적해야하기 때문입니다. 더 동적 인 접근법은 무언가를 정의하는 것과 같습니다.Java에서 ArrayList를 "감싸는"가장 좋은 방법은 무엇입니까?

private ArrayList<ArrayList<ArrayList<Point>>> arr3d = new ArrayList<ArrayList<ArrayList<Element>>>(); 

나는 이것이 받아 들일 수 없을 정도로 추악하다고 생각합니다. 커스텀 데이터 구조, 즉 1 차원 ArrayList (또는 Vector)를 정의한 다음, 어떻게 든 그것을 감싸는 것, 즉 [i, j, k]로 지정된 액세스를 그 단일리스트의 어떤 요소에 매핑하는 것이 더 나을 수도있다. 연산자 []를 덮어 쓸 수 있습니까? 이 작업을 효율적으로 수행하는 방법은 무엇입니까? 기존 라이브러리 나 코드가 있습니까?

추신 : 일반적인 문제 일 수 있다고 생각했지만 최선의 노력에도 불구하고 기존 질문을 찾지 못했습니다. 미리 답변을 드리지 않으면 사과드립니다.

+0

이 난 아직도 이해가 안 ... Point 배열 생성을 자신의 목록을 만들 (당신이 ArrayList를 사용하는 경우에도 내부적으로) 및 포장 AbstractList을 구현하는 – m0skit0

+1

생각을 할 수 있습니다 때문에 정적으로 그들의 차원 수를 선언해야한다.'double [] []'vs'double [] [] []'), op는 런타임에 결정될 것이라고 말합니다. (아마도) – fortran

답변

4

왜 래핑 할 자체 클래스를 만드시겠습니까? 내부적으로 3D 목록을 포함 할 수 있지만 요소에 액세스하고 설정하기위한 "사용자에게 친숙한"메서드 만 노출합니다.

그리고 아니, 자바는 오버로드 할 수 없습니다 []

그것에 대한 빠른 도우미 : 당신이 가독성을 걱정하지 않으면

public class Cube<T> { 
    private final List<List<List<T>>> elements = new ArrayList<List<List<T>>>(); 

    public T get(final int x, final int y, final int z) { 
     if (elements.size() > x) { 
      final List<List<T>> rowx = elements.get(x); 
      if (rowx.size() > y) { 
       final List<T> rowy = rowx.get(y); 
       if (rowy.size() > z) { 
        return rowy.get(z); 
       } 
      } 
     } 
     return null; 
    } 
} 

심지어 한 줄에 그것을 할 수 있습니다 : 필요할 때

public T get(final int x, final int y, final int z) { 
    return (elements.size() > x && elements.get(x).size() > y && elements.get(x).get(y).size() > z ? elements.get(x).get(y).get(z) : null); 
} 

그리고 당신은 방법을 넣어 필요, 즉 (ArrayList에로) 행을 만듭니다.

2

귀하의 질문에 매트릭스의 최대 크기가 무슨 뜻인지 즉시 알 수 없습니다. 항상 3 차원입니까? 또는 사용자의 입력에 따라 N 차원이 될 수 있습니까?

3 차원이라고 가정하면 정규입니까? 모든 행렬 [i, j], [i, k] 및 [j, k]는 다른 모든 행렬과 동일합니까?

그렇다면 두 개의 변수가있는 하나의 플랫 목록으로 구조를 모델링 할 수 있습니다. 하나는 행렬의 단일 레벨에서 행의 길이를 나타내고 다른 하나는 3d 구조에서 그리드의 길이를 나타냅니다 . 정수 나눗셈은 구조로하면 3 차원 위치를 줄 것이다 :

주어진 IDX 않음 행 길이 K 및 염기 크기 K :

n/K 당신 수준을 제공하고 (n%K)/k 그 레벨에게 열을 제공한다. ((n%K))%k 내가 잘못하지 않으면 행의 색인을 제공해야합니다.

로직을 묶는 클래스에서 이것을 감싸고 외부에서 3d 구조처럼 취급 할 수 있습니다.

0

ArrayList<Point[]>은? 당신은 m0skit0 @ ... 배열을 사용하지 왜

관련 문제