2017-10-04 1 views
0

x 좌표와 y 좌표를 가진 개체가 있습니다. 이러한 객체는 겹치지 않고 반드시 정수 좌표가 아닌 격자에 임의로 배치됩니다. 어떤 위치 (a, b)에 물체가 있는지 확인하고 싶습니다. 나는이개체가 좌표에 있는지 확인하는 방법

for (object o : objectList) { 
    if (o.x == a && o.y == b) { 
     return true; 
    } 
} 

같은 모든 개체와 무력 체크 순환을 할 수 알고하지만 객체를 많이 가지고 있고 나는 종종이 검사 방법을 사용하고 있다면, 그것은 충분히 빠르지 않을 것이다. 어떻게하면 더 효율적으로 만들 수 있습니까?

+0

당신은 종류의 컬렉션이 개체가? 위치에 따라 정렬하십시오. – TZHX

+0

데이터 구조에는 여러 가지가 있습니다. [K-d 트리] (https://en.wikipedia.org/wiki/K-d_tree). –

+3

'Set '에서 직위를 지키지 않는 이유는 무엇입니까? – shmosel

답변

0

o.x은 유효하지 않으므로 object은 사용자가 만든 수업이라고 가정합니다. 어쨌든이 접근법에는 몇 가지 방법이 있지만 가장 쉬운 방법은 아마도 2 차원 배열을 사용하는 것입니다.

x을 하나의 색인으로 사용하고 y을 다른 색인으로 사용하십시오. 다음과 같이 입력하십시오 : object[][] objsAt = new object[maxX][maxY]. 그런 다음 특정 좌표의 객체를 확인하려면 obj = objsAt[x][y]을 수행하십시오. 내가 :)

+0

좌표가 반드시 정수가 아닌지 확인하십시오. 정수 값이면 문제가되지 않습니다. – Ryan

0

난 당신이 점을 나타내는 클래스가 있다고 가정 이미 그에 대해 배웠 더라면 당신이 그 (것)들을 생각했을 것 같은데요 있지만

또한, Maps 같은 고급 기술을 사용할 수 있습니다. Comparable<> 인터페이스를 구현하는 것이 좋습니다. 그런 다음 점수를 정렬하십시오. 그리고 하나씩 두 개의 동일한 점이 있는지 확인하십시오.

0

Java를 사용하는 경우 HashSet <>을 사용하여 개체를 저장할 수 있습니다. 그러나 클래스에 자신 만의 equals 및 hashCode 메서드를 구현해야합니다. HashSet의 시간 복잡도는 add() 및 contains()에 대해서만 O (1)입니다. 예를 들어

,

import java.util.HashSet; 

public class DoublePoint { 
    private double x,y; 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     long temp; 
     temp = Double.doubleToLongBits(x); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     temp = Double.doubleToLongBits(y); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     DoublePoint other = (DoublePoint) obj; 
     if (x != other.x) 
      return false; 
     if (y != other.y) 
      return false; 
     return true; 
    } 



    public DoublePoint(double x, double y) { 
     super(); 
     this.x = x; 
     this.y = y; 
    } 

    public static void main(String[] args) { 
     HashSet<DoublePoint> set = new HashSet<>(); 
     set.add(new DoublePoint(1.5, 2.5)); 
     System.out.println(set.contains(new DoublePoint(1.5, 2.5)));//return true 
    } 
} 
관련 문제