2016-07-18 3 views
0

보드 게임을 나타내는 2D 배열이 있다고 가정 해 보겠습니다. 현재 위치와 관련된 배열의 위치를 ​​나타내는 "값"(키) (1, 2, 3 ... 12) 목록이 있습니다."relative"변수를 사용하여 HashMap을 만들 수 있습니까?

예를 들어 array[1][1]에서 키 1은 왼쪽 array[1][0]의 위치를 ​​나타내고 키 2는 왼쪽 및 위의 위치 [0][0]을 나타낼 수 있습니다.

HashMap에서이 두 데이터를 저장할 수있는 방법이 있습니까 (값을 사용할 때마다 if 문이 번지 않도록하고 싶습니다)? 아니면, 어떤 데이터 구조에서? 열거 형을 만드는 것이 적절한 때인가?

분명히 작동하지 않습니다.

int row = 3; 
int col = 5; 
HashMap<Integer,String> markMap = new HashMap<>(); 
markMap.put(1,"col-1"); 
String location = markMap.get(1); 
grid[row][(int)location] = 500; 

답변

1

지금까지 훌륭한 제안. 다른 사람의 떨어져 구축, 당신은 또한 당신의 왼쪽 (1, 1)

에 액세스하기를 원한다면 (호출하여이 디자인을 고수하는 경우, 당신은 그리드 항목에 액세스 할 수

enum Direction { 
    LEFT(-1, 0), 
    UPPERLEFT(-1, -1), 
    DOWN(0, - 1), 
    ...; 

    public final int xoffset; 
    pubiic final int yoffset; 

    Direction(int xoffset, int yoffset) { 
     this.xoffset = xoffset; 
     this.yoffset = yoffset; 
    } 

    public static GridObject getRelativeItem(GridObject[][] grid, int x, int y, Direction dir) { 
     return grid[x + dir.xoffset][y + dir.yoffset]; 
    } 

    public static void setRelativeItem(GridObject[][] grid, int x, int y, Direction dir, GridObject newValue) { 
     grid[x + dir.xoffset][y + dir.yoffset] = newValue; 
    } 
} 

오프셋의 열거를 만들 수 있습니다 설정하려면

Direction.getRelativeItem(grid, 1, 1, LEFT) 

, 당신은 마찬가지로이 값을 설정하기 위해 호출 할 수 있습니다.이 어색하고 인정 하듯이 가난한 추상화의 냄새하지만

Direction.setRelativeItem(grid, 1, 1, LEFT, myValue) 

을 또는 당신이 (오프셋에 대한 게터를 정의 할 수 있습니다 전용 변수 값을 반환하는 인스턴스 메서드 xoffsetyoffset을 추가하십시오. 그런 다음 정적 객체 인 LEFT, UPPERLEFT, DOWN이 cricket_007의 솔루션과 비슷합니다. 당신이 가치를 원한다면이 경우, 당신은 당신이 열거 자신을 인스턴스화 할 수 없습니다,

grid[x + LEFT.xoffset()][y + LEFT.yoffset()] 

이 정의에

grid[x + LEFT.xoffset()][y + LEFT.yoffset()] = myValue; 

설정하기 위해 호출 할 수 있습니다. Enums are initialized by the JVM이며 고정 된 숫자 만 있습니다 (이 경우 LEFT, UPPERLEFT, DOWN ...).

+0

나는 enum을 이해한다고 생각한다. 내 기본 클래스에서 열거 형을 생성/참조/사용하는 방법에 대한 몇 가지 간단한 줄을 보여줄 수 있습니까? 예를 들어 특정 위치의 값을 변경하려는 경우 – Michael

+0

좀 더 자세한 정보로 내 대답을 업데이트했습니다. 나는 개인적으로 게터를 추가 할 것입니다 (조금 나아 보이지만 여전히 좋지는 않습니다). 배열 접근 자 연산자에서 연산을 수행 할 수 있지만 casting은 표현식을 평가하지 않습니다. 나는 당신의 대답으로'grid [row] [(int) location] = 500'을 발견했다. 이것이 작동하지 않는 이유는 Runtime Java가 문자열 "col - 1"을 int로 캐스팅하려고 시도하기 때문입니다 (단순한 숫자 만 처리됨). 불행히도 배열의 표현식을 어느 시점에서 직접 작성해야합니다. – mkzh

2

OOP를 활용하고 개체를 만드십시오! 현재 색인의 상대 위치를 저장하는 delta-x, delta-y의 쌍인 "delta"위치 객체의 배열을 저장하십시오. 당신의 예에서

,

int row = 1; 
int col = 1; 
// one left 
array[row][col] = new DeltaLocation(-1,0); // (col, row) or (x, y) 

int relativeCol = col + array[row][col].getDeltaX(); 

당신은 해시 맵에 이들을 배치, 또는뿐만 아니라 값을 보유 할 수있는 DeltaLocation 객체를 구현할 수 중 하나. 너까지.

+0

이 솔루션은 열거 형을 사용하는 것과 실제로 비슷합니다. 이 방법의 장점은 필요한 경우 런타임에 더 많은 delta-x 및 delta-y를 동적으로 만들 수 있다는 것입니다.열거 형은 델타를 정적으로 고정해도 괜찮 으면 좋습니다. – mkzh

+0

@ mkzh, N^2 열거 형 일 필요는 없습니다. 어느 방향 으로든 한 가지 이상의 직책을 찾고 있다면 어떨까요? 델타 위치가 배열 밖으로 나가면 어떻게 될까요? –

+0

enums **는 ** 실제 객체입니다. –

1

많은 솔루션이 있습니다. 염두에 두어야 할 것은 행 오프셋과 열 오프셋을 두 개의 다른 맵에 저장하는 것입니다. 예를 들어

int row = 3 
int col = 5 
HashMap<Integer, Integer> rowOffset = new HashMap<>(); 
HashMap<Integer, Integer> colOffset = new HashMap<>(); 
rowOffset.put(1, 0) 
colOffset.put(1, -1) 
grid[row + rowOffset.get(1)][col + colOffset.get(1)] = 500 

행 및 열 오프셋을 모두 저장하는 개체를 만드는 것이 더 깨끗할 수 있지만 아이디어가 있어야합니다.

+0

두 개의 HashMaps에 대한 아이디어가 마음에 들지만 양쪽 오프셋이있는 객체를 만드는 것이 더 깔끔하다고 말했죠. 그것으로 다른 사람들이 제안한 객체/열거 형을 참조하고 있습니까? – Michael

+0

다른 답변은 내 대답을 올린 시점에 추가되지 않았으므로 나는 그 답변을 언급하지 않았습니다. Direction 열거 형에서 가져온 객체는 객체에 행과 열 오프셋을 모두 가지고 있습니다. 방향 객체와 같은 객체를 HashMap에 int로 채우는 선을 따라 생각하고 있었지만 마음에있는 것과 같습니다. 키. 열거 형을 사용하면 다른 방법으로 액세스 할 수 있으므로 HashMap은 필요하지 않습니다. 단점은 사용하기 위해 필요한 모든 오프셋 쌍을 미리 알아야한다는 것입니다. –

관련 문제