我遇到了一个问题我正在解析一个Json文件并从中删除重复,所以我认为我会将它存储在我的类的Hashset中,该Hashset包含信息,但它不会删除重复。 如果我有什么不对的话,你能解释一下我有什么不对吗?
这是我的代码示例:
try {
FileReader f = new FileReader("E:\\JavaDev\\src\\main\\resources\\annonces.json");
JsonReader jsonReader = new JsonReader(f);
Gson gson = new Gson();
Appartement[] res2 = new Appartement[0];
res2 = gson.fromJson(jsonReader, res2.getClass());
Set<Appartement> test = new HashSet<Appartement>(Arrays.asList(res2));
System.out.println(test.size());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我的公寓看起来像这样: (这里删除了getter和setter以获得更小的代码)
public class Appartement {
private String id;
private Double surface;
private String marketingType;
private Integer roomCount;
private String propertyType;
private Boolean furnished;
private Boolean newBuild;
private String zipCode;
private Double price;
}
我尝试直接在Hashset中转换我的json,但是我遇到了一个错误:java.lang.OutOfMemoryError:Java堆空间
HashSet<Appartement> mySet = gson.fromJson(jsonReader, HashSet.class);
我验证了Json文件中存在重复。
会在这里给予一些帮助。
答案 0 :(得分:0)
Set<Appartement> test = new HashSet<Appartement>(Arrays.asList(res2));
您必须确保覆盖Apartment的hashcode和equals方法,并从同一Appartement的equals方法返回true。 (基于其属性)否则将调用Objects.equals
答案 1 :(得分:0)
您必须覆盖Appartment类的equals方法,
请参阅此处:Object equal method,如果您不覆盖其默认的等值方法,它实际上会比较对象的引用,
public class Appartement {
private String id;
....
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Appartement)) return false;
return this.id.equals(((Appartement)obj.id));
}
@Override
public int hashCode() {
return 123123131311; //replace to your own hashcode.
}
}
Joshua,Effective Java
您必须覆盖覆盖equals()的每个类中的hashCode()。 如果不这样做将导致违反总承包合同 对于Object.hashCode(),它将阻止您的类运行 正确地与所有基于散列的集合一起使用,包括 HashMap,HashSet和Hashtable。
答案 2 :(得分:0)
你需要在Appartement.class中覆盖equals方法(需要适当的等式检查)和hascode方法
import java.util.*;
public class HelloWorld{
public static void main(String []args){
System.out.println("Hello World");
Appartement[] res2 = {(new HelloWorld()).new Appartement("1"), (new HelloWorld()).new Appartement("2"), (new HelloWorld()).new Appartement("3"),(new HelloWorld()).new Appartement("1") };
Set<Appartement> test = new HashSet<Appartement>(Arrays.asList(res2));
System.out.println(test.size());
}
public class Appartement {
private String id;
private Double surface;
private String marketingType;
private Integer roomCount;
private String propertyType;
private Boolean furnished;
private Boolean newBuild;
private String zipCode;
private Double price;
public Appartement(String id){
this.id=id;
}
@Override
public boolean equals (Object other)
{
if (!(other instanceof Appartement))
return false;
Appartement ob = (Appartement) other;
return this.id.equals(ob.id) ;
}
@Override
public int hashCode ()
{
return Arrays.hashCode(new String[]{id});
}
}
}