2012-01-09 7 views
4
내가 루프

해시 맵 오브젝트 키

public static void main(String[] args) { 

    Map<Design, Double> map = new HashMap<Design, Double>(); 

    double[] dbl = new double[2]; 

    for(int i=0; i<5; i++){ 
     for(int j=0; j<2; j++){ 
      System.out.println(j+i); 
      dbl[j] = j+i; 
     } 
     Design des = new Design(dbl); 
     map.put(des, Double.valueOf(i)); 
    } 

    for(Design d: map.keySet()){ 
     System.out.println(d.getFactors()[0] + "\t" + d.getFactors()[1]); 
    } 

    for(double d: map.values()){ 
     System.out.println(d); 
    } 
} 

를 사용하여 매핑 값을 추가

public class Design { 
private double[] factors = null; 

public double[] getFactors() { 
    return factors; 
} 

public void setFactors(double[] factors) { 
    this.factors = factors; 
} 

public Design(double[] factors) { 
    this.factors = factors; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + Arrays.hashCode(factors); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Design)) 
     return false; 
    Design other = (Design) obj; 
    if (!Arrays.equals(factors, other.factors)) 
     return false; 
    return true; 
} 

오버라이드 (override) hasCode()와 같음()와 해시 맵 내 키와이 클래스를 사용하고

문제는 핵심 가치에 있습니다. 마지막으로 추가 된 키가 표시됩니다.

4.0 5.0 
4.0 5.0 
4.0 5.0 
4.0 5.0 
4.0 5.0 

어디서 잘못 되었나요?

+0

덕분에 ... 당신의 문제 그러나 관련이

if (!(obj.getClass() == getClass())) return false; 

if (!(obj instanceof Design)) return false; 

을 변경 해결 방법은 DBL을 추가했다 = 새로운 더블 [2] 새로운 값을 배열에 할당하기 전에 ... –

답변

2

배열의 선언을 for 루프로 옮기면 모두 예상대로 진행됩니다. 문제는 모든 Design 인스턴스가 동일한 배열을 갖기 때문입니다. 당신이 Design의 서브 클래스가있을 때

for(int i=0; i<5; i++){ 
    double[] dbl = new double[2]; 
    for(int j=0; j<2; j++){ 
     System.out.println(j+i); 
     dbl[j] = j+i; 
    } 
    Design des = new Design(dbl); 
    map.put(des, Double.valueOf(i)); 
} 

또한, 당신의 equals 방법은 잘못된 결과를 얻을 것입니다. instanceof 대신에 클래스를 비교하십시오. 그래서이

3

double[] factors 배열을 setFactors 및 생성자에 복사하지 않습니다. 따라서 키 클래스의 모든 인스턴스가 루프에서 수정하는 것과 동일한 배열을 공유하게됩니다. 다음과 같이

당신은 setFactors을 변경해야합니다 :

public void setFactors(double[] factors) { 
    this.factors = new double[factors]; 
    System.arrayCopy(factors, 0, this.factors, 0, factors.length); 
} 

public Design(double[] factors) { 
    setFactors(factors); 
} 
3

문제는 당신이 디자인의 생성 모든 인스턴스에 대해 두 배의 동일한 배열을 사용하고 있습니다. 메인 루프에서 다음 숫자를 초기화하면 첫 번째 오브젝트가 다시 수정됩니다. 이 시도 : 그 응용 프로그램에서 허용하지의 성능 오버 헤드를했을 경우,

public double[] getFactors() { 
    return factors.clone(); 
} 

public void setFactors(double[] factors) { 
    this.factors = factors.clone(); 
} 

public Design(double[] factors) { 
    setFactors(factors); 
} 

을 또는 당신이 setFactors에 전달 된 배열과 getFactors의 반환 값을 사용하는 방법에 대해 매우주의해야합니다.

2

하나의 배열 객체 만 만들었습니다. Java는 배열에 대한 참조 의미를 사용하므로 루프를 거칠 때마다 배열의 값을 변경하면 모든 변경 내용이 Design 객체에 반영됩니다.

다른 말로하면, 다섯 개의 다른 Design 개체가 있고 모두 인쇄하고 있지만 모두 동일한 배열을 참조합니다.

이 문제를 해결하려면 루프를 반복 할 때마다 새 배열을 만듭니다.