在JAVA中解析Json时删除重复项,Hashset无法正常工作

时间:2017-05-26 03:25:12

标签: java json hashset

我遇到了一个问题我正在解析一个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文件中存在重复。

会在这里给予一些帮助。

3 个答案:

答案 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});
                }
            }
}