2013-03-03 3 views
1

빠른 컨테이너가 Java에서 개체를 저장하려면 컨테이너에 (정적) XYZ 좌표가 있고 모든 개체의 좌표가 다릅니다. 기본적으로 그리드이지만, 0,0,0 주위에 집중되지 않을 수도 있습니다 (그리드에서 누락 된 부분이있을 수 있습니다).xyz 키가있는 컨테이너

정수를 키로 사용하고 좌표를 비트 시프 팅하여 모든 좌표에 대해 고유 번호를 만들려고했습니다. 그러나 숫자가 255 (8 비트)를 넘었을 때 너무 잘 작동하지 않았습니다.

지도는 실제로 배열의 값을 참조하지 않고 참조하므로 키가 작동하지 않습니다. 또한 String을 키로 사용할 수도 있지만 객체에 액세스 할 때마다 String을 다시 작성해야합니다.

이제 ArrayList를 사용하고 모든 키를 반복하지만 그 속도는 매우 느립니다. 그렇다면 객체를 저장하는 가장 빠른 (그리고 메모리 효율적인) 방법은 무엇일까요?

+0

무언가를 얻으려는 시도가 있습니까? 그게 뭐야? –

+0

x, y 및 z는 정적이므로 모든 개체가 다를 수 없습니다. –

+0

@ BheshGurung 무엇? 개체의 xyz 값은 변경되지 않습니다. 그러나 모든 객체에는 다른 값이 있습니다. – Sietse

답변

1

사용자 지정 클래스를 만들고 사용자 지정 hashCode() 및 equals() 메서드를 사용하여 키로 사용하십시오.

public static class Vertex { 
    public int x, y, z; 
    public boolean equals(Object o){ 
     if(this == o) return true; 
     if(!(o instanceof Vertex)) return false; 
     Vertex v = (Vertex)o; 
     return x == v.x && y == v.y && z == v.z; 
    } 

    public int hashCode(){ 
     // Use whatever prime numbers you like 
     return x^y * 137^z * 11317; 
    } 
} 

키로 사용중인 인스턴스의 값을 변경하지 않았는지 확인하십시오.

이것은 단순한 정수를 사용하는 것보다 심각하지 않습니다. 여전히 효과적으로 일정 시간 액세스 할 수 있습니다.

+0

실제로이 문제를 시도했지만 hashCode 메서드를 만드는 데 문제가있었습니다. 나는'x << 16 | y << 8 | z << 0이다. 그것은 높은 숫자로 오류를 주었다. 소수의 배후에있는 마법은 무엇입니까? 설명 하시거나 링크를 주시겠습니까? – Sietse

+0

목적은 해시 맵이 값을 저장하는 방식 때문입니다. 대개 짝수 번 버킷 (확장해야 할 때 용량이 두 배이기 때문에)이 있으며 항목을 저장할 위치를 결정하기 위해 버킷 수로 해시 코드를 모듈화합니다. 버텍스의 수와 프라임 팩터를 공유하는 좌표로 좌표 중 하나를 곱하면 동일한 축 또는 평면을 따라 놓인 것이 동일한 버킷에있게되어 최악의 경우 O (n) 액세스보다는 O (1) 액세스. –

+0

그것은 다소 큰 주제입니다. 해시 테이블, 해시 함수 및 콜리 손을 찾습니다. –