2014-05-22 2 views
0

안드로이드에 있음 사용자가 이미 눌러 놓은 그리드를 저장하려고합니다. 내가 사용 자르는 것은에 HashSet에 포함되어 있음 <int[]>()

코드는 다음과 같습니다 함수에서

// private 
private HashSet<int[]> PlayerSelectedHashField = new HashSet<int[]>(); 
private boolean collisionDetected = false; 

나는 예상대로 .add 기능이 작동

collisionDetected = PlayerSelectedHashField.contains(TmpPos); // -> Fail - not working 
{doing something} 
PlayerSelectedHashField.add(TmpPos); // int[] TmpPos - TmpPos is x y 

를 사용하고 있지만, .contains는 항상 false를 돌려줍니다. 왜 작동하지 않습니다 - 대신 무엇을 할 수 있습니까?

+0

int []의 해시가 내용이 아닌 객체 인스턴스와 관련되어 있기 때문에 – njzk2

답변

3
public boolean contains(Object o) { 
    return map.containsKey(o); 
} 

containsKey :

public boolean containsKey(Object key) { 
    return getNode(hash(key), key) != null; 
} 

는 getNode : arraysequals가의 비교 ==을 할 것이기 때문에

final Node<K,V> getNode(int hash, Object key) { 
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k; 
    if ((tab = table) != null && (n = tab.length) > 0 && 
     (first = tab[(n - 1) & hash]) != null) { 
     if (first.hash == hash && // always check first node 
      ((k = first.key) == key || (key != null && key.equals(k)))) 
      return first; 
     if ((e = first.next) != null) { 
      if (first instanceof TreeNode) 
       return ((TreeNode<K,V>)first).getTreeNode(hash, key); 
      do { 
       if (e.hash == hash && 
        ((k = e.key) == key || (key != null && key.equals(k)))) 
        return e; 
      } while ((e = e.next) != null); 
     } 
    } 
    return null; 
} 

그것은 작동하지 않습니다, 그것은 그들이 가리 경우에만 true를 돌려줍니다 같은 인스턴스.

귀하의 문제는 (적어도 나를 위해 (문제가 될 수 있습니다.) 내가하는 쉬운 방법을 선호)

저장하기 때문에 (두 개의 배열 요소를 비교하고 참조 할 수있는 방법) Arrays.equals와 함께 작업없이 고정 할 수

XY 좌표, 그냥 Point

public class Point { 
    public final int X; 
    public final int Y; 

    public Point(int x, int y) 
    { 
     X = x; 
     Y = y; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj == this) { 
      return true; 
     } 

     if (obj instanceof Point) { 
      Point pObj = (Point) obj; 
      return pObj.X == X && pObj.Y == Y; 
     } 

     return false; 
    } 

    @Override 
    public int hashCode() 
    { 
     int result = X; 
     result = 31 * result + Y; 
     return result; 
    } 
} 

다음 X, Y 점을 저장 Point 클래스를 사용하는 클래스를 만든다.

사용자 정의 포인트 클래스를 만드는 대신 Android Point을 사용할 수 있습니다.

예제 HashSet의 javadoc에서

Set<Point> points = new HashSet<Point>(); 
points.add(new Point(1, 3)); 
points.add(new Point(1, 4)); 

System.out.println(points.contains(new Point(1, 3))); 
System.out.println(points.contains(new Point(1, 4))); 
System.out.println(points.contains(new Point(1, 5))); 
+2

좋은 답변입니다. 참고로 OP에서 사용할 수있는 [Point] (http://developer.android.com/reference/android/graphics/Point.html) 클래스가 이미 있습니다. – ashishduh

+0

오, 안드로이드 태그를 읽지 않았습니다. 나는 그것을 추가 할 것이다 @ashishduh –

+1

빠른 질문 : 왜 31? – njzk2

0

:이 세트로 지정된 요소가있는 경우에

공공 부울 (객체 O)

반환 사실이 포함되어 있습니다. 이 세트가 (o == null? e == null : o.equals (e))와 같은 요소 e를 보관 유지하고있는 경우에만 true를 리턴합니다. 당신은 당신이 특정 객체 유형에 equals를 호출 할 때 어떻게되는지 모르는 경우 예상대로

그래서, 일반적으로, 다음 contains도 동작하지 않을 수 있습니다. 특정 객체에 대한 클래스가 프로그램에서 개념적 의미를 갖는다면 결코 나쁜 생각이 아닙니다. 그렇게하면 equals 메서드를 재정 의하여 원하는대로 올바르게 작동하는지 확인할 수 있습니다.

관련 문제