当前位置: 首页 > 知识库问答 >
问题:

HashSet等于,hashCode被重写,stil有重复

丰景同
2023-03-14
 public class DateObj extends Date implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;
    private String fName;
    private String sName;
    private String days;
    private String country;
    private boolean fitIn;


    public DateObj(String id,String fName, String sName, String country, String days) {
        this.id = id;
        this.fName = fName;
        this.sName = sName;
        this.days = days;
        this.country = country;

    }

    @Override
    public boolean equals(Object obj) {

        DateObj dateObj = (DateObj) obj;
        System.out.println("method Call");


        return getfName().equals(dateObj.getfName());
    }

    public String getfName() {
        return fName;
    }

    public void setfName(String fName) {
        this.fName = fName;
    }

    public String getsName() {
        return sName;
    }

    public void setsName(String sName) {
        this.sName = sName;
    }

    public String getDays() {
        return days;
    }

    public void setDays(String days) {
        this.days = days;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String toString(){
        return fName;
    }

@Override
public int hashCode() {
    return fName.hashCode();
}

}

==========================================================================================

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;

public class DataSaveTo {

    private ArrayList<DateObj> listData = new ArrayList<DateObj>();
    File file = new File("data3.csv");
    public static void main(String[] args) {


        DataSaveTo dataExperiment = new DataSaveTo();
        dataExperiment.go();


    }

    public void go() {



        loadData();

        TreeSet<DateObj> data = new TreeSet<DateObj>();
        data.addAll(listData);
    //  ObjComparInt comparId = new ObjComparInt();
    //  ObjectComparable comparObj = new ObjectComparable();
    //  Collections.sort(listData, comparId);
        saveData();
    //  System.out.println(listData);


    }



    public void saveData() {

        try {
            File file = new File("dataNoDupl.csv");
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            for(DateObj obj : listData){
                bw.write(obj.getId()+";"+obj.getfName()+";"+obj.getsName()+";"+obj.getCountry()+";"+obj.getDays()+"\n ");
            }
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Exception in save Data method:  "+ e);

        }

    }

    public  void loadData() {
        FileReader fr;
        try {
            fr = new FileReader(file);
            String s = null;
            String[] tokens;
            BufferedReader br = new BufferedReader(fr);
            while((s=br.readLine())!=null){
                tokens = s.split(",");
                createDateObj(tokens);
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println("Exception in LoadData method"+e);
        } catch (IOException e) {
            System.out.println("Exception in LoadData method 2nd catch"+e);
            e.printStackTrace();
        }


    }



    private void createDateObj(String[] tokens) {

        DateObj obj = new DateObj(tokens[4],tokens[0],tokens[2],tokens[3],tokens[1]);
        listData.add(obj);
        System.out.println(obj.hashCode()+"--"+obj.getfName()+"--"+obj.getsName());

    }



    //  Name comparator
    public class ObjectComparable implements Comparator<DateObj>{
        @Override
        public int compare(DateObj obj, DateObj obj1) {
            return obj.getfName().compareTo(obj1.getfName());

        }
    }

        // ID comparator
    public class ObjComparInt implements Comparator<DateObj>{
        @Override   
        public int compare(DateObj ob, DateObj ob1){
            return Integer.parseInt(ob.getId()) - Integer.parseInt(ob1.getId());
            }
        }


    }

我希望HashSet调用equal方法,因为重写了hashCode。在equals compare之后,我想删除我要传递到hashSet的集合中的重复项。

HashSet<DateObj> data = new HashSet<DateObj>();
    data.addAll(listData);

控制台中,它将我打印出来,为true(因为在equals方法中有sys.out),但它什么也不做。我有复本。

共有2个答案

杜正奇
2023-03-14

hashCode()的Java文档说明:

如果根据equals(Object)方法,两个对象相等,则对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果。

您的实现违反了此规则,您需要更改hashCode()equals()的实现来实现它。

您可能需要更新equals()

@Override
public boolean equals(Object obj){
    if (obj == null || !(obj instanceof DateObj)) {
        return false;
    }
    DateObj dateObj = (DateObj) obj;
    return getfName().equals(dateObj.getfName()) && getsName().equals(dateObj.getsName());
}
段超
2023-03-14

具有相同的fName不会获得相同的哈希值。当你考虑sName同时生成哈希代码。

将对象放入哈希集中时,会生成哈希代码,哈希代码实现会根据fNamesName生成哈希代码。另一方面,你只在你的相等方法中匹配fName,并得到true打印!

首先定义何时要考虑相同的对象。使用这些条件在equals方法中进行匹配,并在hashCode方法中也考虑它们。因为如果两个对象相等,它们的哈希代码必须相等!

 类似资料:
  • 该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。

  • 我的问题是关于我被重写的hashCode()方法。我知道,如果equals(Object)方法认为两个对象相等,我需要hashCode()为它们返回相同的值。我的直觉告诉我,在某些情况下,这个hashCode()会违反合同。 有没有一种可接受的方法可以在一个重写的equals(Object)方法中使用equalsIgnoreCase(String)方法,并生成一个不违反约定的hashcode?

  • 我需要扩展AbstractTableModel来表示表中的一些数据。我有一个类< code>Car,它应该代表表中的一个项目(行): 这些对象存储在中,它驻留在中: 就我所知,我需要在AbstractTableModel中覆盖至少3个方法。如何为HashSet重写getValueAt?关于HashSet的rowIndex和columnIndex参数是什么?如果我们不能通过一个索引从一个哈希表中获取

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha

  • 问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,

  • 本文向大家介绍请你解释为什么重写equals还要重写hashcode?相关面试题,主要包含被问及请你解释为什么重写equals还要重写hashcode?时的应答技巧和注意事项,需要的朋友参考一下 考点:java基础 HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义