2009-03-26 3 views
3

일의 2 차원 배열 종류를 구현하고 싶습니다.Java에서 2 차원 배열을 구현하는 데 가장 적합한 데이터 구조는 무엇입니까?

어떤 데이터 구조가 가장 적합할까요? 배열 또는 다른 데이터 구조가 수행합니다. 내 요구 사항을 충족시킬 다른 데이터 구조가 있다면 알려주십시오.

2 차원 배열을 프로그램의 초기에 선언해야하지만 고정되어 있지 않으므로 배열을 사용하고 싶지 않습니다. 크기는 런타임에 결정됩니다.

또한 행 수는 열 수와 같습니다. 행과 열 모두에 동일한 이름이 주어지기 때문에 이것은 수정되었습니다.

또한지도를 통해이 2-D 데이터 구조를 탐색하려고합니다.

+1

그것은 당신이 정말로 원하는 것을 말할 꽤 어렵다 같은지도를 사용할 수는 ... 시도 질문의 표현을 개선하고 2D 데이터 구조를 어떻게 사용할지 보여주는 몇 가지 예제 코드를 추가 할 수 있습니다. –

+0

@ Young : 질문을 바꿔 봤습니다. 잘못 생각한 것 같으면 다시 편집하십시오. –

답변

0

배열 은 런타임에 크기가 지정됩니다. 너무 자주 변하지 않는 행/열 크기가 있고 데이터가 너무 희소하지 않은 경우 배열이 최선의 방법입니다. (의견에 따라 편집)

class TwoDimArray { 
    public int[][] createArray(int nRows, int nCols) { 
     return new int[nRows][nCols]; 
    } 
    public int[][] resizeArray(int[][] oldArray, int nRows, int nCols) { 
     int[][] newArray = new int[nRows][nCols]; 
     for (int i=0; i<Math.min(oldArray.length, nRows); ++i) 
      for (int j=0; j<Math.min(oldArray[i].length, nCols); ++j) 
       newArray[i][j] = oldArray[i][j]; 
     return newArray; 
    } 
} 
+0

프로그램을 제공해 주셔서 감사합니다. 그것은 분명히 도왔습니다 .. – AGeek

+0

좋아, 이걸 갖고 싶습니다 ... 각 행과 열에는 나중에 매핑 할 수있는 이름이 있어야합니다. 자바의지도 데이터 구조에 키가 있기 때문에. util 패키지 ... 다른 방법이 있습니까? – AGeek

1

크기가 문제가되지 않습니다 그 런타임에 결정되는 경우

. 이것은 작동 할 수도 있습니다 :

final int[][]    data; 
final int     size; 
final Map<String, Integer> names; 

// code that sets the size variable 
names = new HashMap<String, Integer>(); 
data = new int[size][size]; 

names.put("ID-A", 0); 
names.put("ID-B", 1); 

data[names.get("ID-A")][names.get("ID-A")] = 39; 
data[names.get("ID-A")][names.get("ID-B")] = 40; 
data[names.get("ID-B")][names.get("ID-A")] = 41; 
data[names.get("ID-B")][names.get("ID-B")] = 42; 
+0

okk, 나는 vl을 사용해보십시오. – AGeek

+0

좋아, 이걸 갖고 싶습니다. 각 행과 열에는 나중에 매핑 할 수있는 이름. Java.util 패키지의 맵 데이터 구조에 키가있는 것처럼 ...거기에 다른 방법이 있습니까 ... – AGeek

6

행키, col 키 및 해당 위치의 값을 사용하려는 것처럼 들립니다. 거기에 내장 된 데이터 구조는 없습니다.

가장 쉬운 방법은 실제 데이터의 2 차원 배열 일 수 있습니다. 행 또는 열 이름에서 배열의 실제 색인으로 이동하려면 다음과 같이하십시오. 원하는만큼 많은 이름 - 인덱스 바인딩을 추가하십시오.

Map<String, Integer> rows = new HashMap<String, Integer>(); 
Map<String, Integer> cols = new HashMap<String, Integer>(); 

그런 다음 당신이 청소기 API를 원하는 경우
grid[rows.get("Row name")][cols.get("Column name")]; 

클래스에 그리드와 get(String rowName, String colName) 방법을 넣어 ... 그리드에 그 값을 받고.

편집 : 질문이 업데이트 된 것을보고 이름과 색인의 쌍이 행과 열 모두에서 동일하게 보입니다. 그래서 여기에 업데이트 된 버전입니다 : 주어진 답변이 만족하지 않은 경우

class SquareMap<V> { 
    private V[][] grid; 
    private Map<String, Integer> indexes; 

    public SquareMap(int size) { 
     grid = (V[][]) new Object[size][size]; 
     indexes = new HashMap<String, Integer>(); 
    } 

    public void setIndex(String name, int index) { 
     indexes.put(name, index); 
    } 

    public void set(String row, String col, V value) { 
     grid[indexes.get(row)][indexes.get(col)] = value; 
    } 
    public V get(String row, String col) { 
     return grid[indexes.get(row)][indexes.get(col)]; 
    } 
} 
+0

통해 ur 프로그램 뒤에 아이디어를 사용하는 더 깨끗하고 효율적으로 보입니다.하지만 난 understodo 그리드의 사용을하지 않았습니다 .. 어떻게 내 프로그램 에서이 격자를 사용합니까 ... – AGeek

+0

안녕 Logged 제발이 Grid의 기능을 설명해 주시겠습니까 ...이 그리드 란 무엇이며 어떻게 가치를 저장할 수 있습니까? – AGeek

0

당신은 단지

class TwoDArray<V> implements Iterable<Map.Entry<Point, V>> { 
    private final Map<Point, V> map = new LinkedHashMap<Point, V>(); 
    public V set(int x, int y, V value) { 
     return map.put(new Point(x,y), value); 
    } 
    public V get(int x, int y) { 
     return map.get(new Point(x, y)); 
    } 
    public Iterator<Map.Entry<Point, V>> iterator() { 
     return map.entrySet().iterator(); 
    } 
} 

// to iterate 
TwoDArray<Double> twoDArray = new TwoDArray(); 
twoDArray.set(3, 5, 56.0); 
twoDArray.set(-1000, 5, 123.4); 
twoDArray.set(789, -100000000, -156.9); 
for(Map.Entry<Point, Double> entry: twoDArray) { 
    // 
}