-1

整数格子上の点を表す Point クラスを定義しました。hashCode() と equals(Object) のメソッドをオーバーライドしました。

座標値 >= 128 のポイントに対して HashMap.put(Point, Double) を使用すると、HashMap は何もしないようです。エラーはスローされませんが、HashMap からポイントにアクセスしようとすると、キーが見つからないという結果になります。私は INTEGER.MAX_VALUE を十分に下回っており、十分なメモリを利用できます。

ここに私のポイントクラスがあります:

import java.util.ArrayList;

public class Point {
    protected int dimension;
    protected ArrayList<Integer> coordinates;

    public Point(int[] coordinates){
        this.coordinates = convertArray(coordinates);
        dimension = coordinates.length;
    }

    private ArrayList<Integer> convertArray(int[] array){
        ArrayList<Integer> newArray = new ArrayList<Integer>();
        for(int i = 0; i < array.length; i++){
            newArray.add(array[i]);
        }
        return newArray;
    }

    @Override
    public int hashCode(){
        // Some arbitrary quick hash
        return coordinates.get(0);
    }

    @Override
    public boolean equals(Object o){
        Point p = (Point)o;
        if(dimension != p.coordinates.size())
            return false;
        for(int i = 0; i < p.coordinates.size(); i++){
            if(coordinates.get(i) != p.coordinates.get(i)){
                return false;
            }
        }
        return true;
    }
}

そして私が実行したテスト:

import java.util.*;
public class random {

    public static void main(String[] args) {
        HashMap<Point, Double> weight = new HashMap<Point, Double>((int)(150 * 150 * .75 + 1));
        for(int i = 0; i < 150; i++){
            for(int j = 0; j < 150; j++){
                int [] tmpArray = {i, j};
                weight.put(new Point(tmpArray), Math.random());
            }
        }

        for(int i = 0; i < 150; i++){
            for(int j = 0; j < 150; j++){
                int [] tmpArray = {i, j};
                if(weight.get(new Point(tmpArray)) == null){
                    System.out.println("[" + i + ", " + j + "]: ");
                    System.out.println(weight.containsKey(new Point(tmpArray)));
                }
            }
        }
    }
}

どんなアイデアでも役に立ちます。ありがとう!

4

1 に答える 1

0
@Override
    public boolean equals(Object o){
        Point p = (Point)o;
        if(dimension != p.coordinates.size())
            return false;
        for(int i = 0; i < p.coordinates.size(); i++){
            if(coordinates.get(i) != p.coordinates.get(i)){
                return false;
            }
        }
        return true;
    }

使用する必要があるオブジェクトを、同じ場所 (!=) を指している場合ではなく、観測上の等価性equals()と比較する場合、実装は不適切です。equals==

Integerはオブジェクトなので、使用する必要があります。同じ値に対してequalsうまく==動作することがあり、キャッシュされます (-128 から 127)。

例:

Integer a = 1000, b = 1000;  
System.out.println(a == b); // false  
Integer c = 100, d = 100;  
System.out.println(c == d); // true
Integer e=5 , f= new Integer(5);
System.out.println(e == f) // false

リストをループする代わりに、提供されたリストメソッド equals()を使用するだけです

指定されたオブジェクトもリストであり、両方のリストが同じサイズであり、2 つのリスト内の対応するすべての要素のペアが等しい場合にのみ、true を返します。

また、変更可能なオブジェクトでは as を使用しないでKeyくださいhash valued map可変ハッシュマップキーは危険ですか?

オブジェクトの hashCode() 値がその状態に基づいて変化する可能性がある場合、そのようなオブジェクトをハッシュベースのコレクションでキーとして使用する場合は、それらがハッシュ キーとして使用されているときに状態が変化しないように注意する必要があります。 . すべてのハッシュベースのコレクションは、コレクション内のキーとして使用されているオブジェクトのハッシュ値が変更されないことを前提としています。キーがコレクション内にある間にキーのハッシュ コードが変更された場合、予測不能で紛らわしい結果が続く可能性があります。

于 2013-07-13T17:06:21.047 に答える