Java - реализация equals () и hashCode () - PullRequest
0 голосов
/ 07 января 2019

У меня есть класс PointDensity, который реализован как:

import java.sql.Date;

public class PointDensity {

    private int id_place;

    private String algorithm;

    private Date mission_date;

    private int mission_hour;

    private int x;

    private int y;

    public PointDensity(int id_place, String algorithm, Date mission_date, int mission_hour, int x, int y) {

        this.id_place = id_place;
        this.algorithm = algorithm;
        this.mission_date = mission_date;
        this.mission_hour = mission_hour;
        this.x = x;
        this.y = y;
    }


    @Override
    public boolean equals(Object obj){
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PointDensity other = (PointDensity) obj;
        return id_place == other.id_place
            && algorithm.equals(other.algorithm) 
            && mission_date.equals(other.mission_date)

            && mission_hour == other.mission_hour
            && x == other.x
            && y== other.y;
    }

    @Override
    public int hashCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result + y;
        result = prime * result + ((algorithm == null) ? 0 : algorithm.hashCode());
        result = prime * result + x;
        result = prime * result + ((mission_date == null) ? 0 : mission_date.toString().hashCode());
        result = prime * result + mission_hour;
        result = prime * result + id_place;
        return result;
    }
}

Я читаю некоторые вещи и получаю значения из базы данных. И затем я хочу использовать HashMap (), чтобы сохранить объект PointDensity в качестве ключа и время, когда он встречался в качестве значения. Тем не менее, он никогда не обнаружит, что объект тот же.

    Map<PointDensity, Integer> pointDensities = new HashMap<>();
    while (resultSet.next()){
        PointDensity pointDensity = 
            new PointDensity(
                resultSet.getInt(1), 
                resultSet.getString(2),
                new Date(timestampValues.getLong(i)), 
                new java.util.Date(timestampValues.getLong(i)).getHours(),
                xValues.getInt(i), 
                yValues.getInt(i)
            );  
        if (pointDensities.containsKey(pointDensity)){
            //IT NEVER ENTERS HERE!!!
            System.out.println("exists");
            int times = pointDensities.get(pointDensity);
            pointDensities.replace(pointDensity, times++);
        }else{
            pointDensities.put(pointDensity, 1);
        }
    }        

Заранее спасибо:)

1 Ответ

0 голосов
/ 07 января 2019

Следующий код работает для меня, ваши методы hashcode и equals кажутся нормальными. Ошибка должна быть в коде, который вы нам не показываете, или в самих данных базы данных.

    public static void main( String[] args ) {
       Map<PointDensity, Integer> pointDensities = new HashMap<>();
       PointDensity pointDensity = new PointDensity( 10, "TEST",
               new Date( 3, 1, 2019 ), new java.util.Date().getHours(),
               42, 24 );
       pointDensities.put( pointDensity, 1 );
       System.out.println( "pointDensity equal to self:"
               + pointDensity.equals( pointDensity ) );
       if( pointDensities.containsKey( pointDensity ) ) {

          //IT NEVER ENTERS HERE!!!
          System.out.println( "exists" );
          int times = pointDensities.get( pointDensity );
          pointDensities.replace( pointDensity, times++ );
       } else {
          pointDensities.put( pointDensity, 1 );
       }
    }
}

Выход:

run:
pointDensity equal to self:true
exists
BUILD SUCCESSFUL (total time: 0 seconds)
...