Java 在自定义ArrayList中仅添加一次项

Java 在自定义ArrayList中仅添加一次项,java,android,arraylist,Java,Android,Arraylist,我制作了自己的自定义ArrayList,如下所示: public class Points { String hoodName; Double points; Integer hoodId; public Points(String hN, Double p, Integer hI){ hoodName = hN; points =p; hoodId = hI; } public Double ge

我制作了自己的自定义ArrayList,如下所示:

public class Points {
    String hoodName;
    Double points;
    Integer hoodId;
    public Points(String hN, Double p, Integer hI){
        hoodName = hN;
        points =p;
        hoodId = hI;
    }

    public Double getPoints() {
        return points;
    }

    public Integer getHoodId() {
        return hoodId;
    }

    public String getHoodName() {
        return hoodName;
    }
}
当我从JSON api添加数据时,它会多次添加项。我尝试了以下代码,只添加了一次项目:

if (!points.contains(jsonObject.getString("hood_name"))) {
                                    points.add(new Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")));
                                }
如果您也尝试过这一点:

if (!points.contains(Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")))) {
                                    points.add(new Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")));
                                }
当我使用ArrayList或
ArrayList
时,此代码有效,但当我使用
ArrayList


有人能告诉我如何避免重复我的列表吗

如果序列不重要,则可以使用
HashMap
来唯一标识它们

HashMap<String, Point> pointMap = new HashMap<>();
String hoodName = jsonObject.getString("hood_name");
Point point = new Point(jsonObject.getString("hood_name"),
                  jsonObject.getDouble("points"),
                  jsonObject.getInt("hood_id"))
if (!points.containsKey(hoodName)) pointMap.put(hoodName, point);
HashMap pointMap=newhashmap();
String hoodName=jsonObject.getString(“hood_name”);
Point=新点(jsonObject.getString(“hood_name”),
jsonObject.getDouble(“点”),
jsonObject.getInt(“hood_id”))
如果(!points.containsKey(hoodName))pointMap.put(hoodName,point);

事实上,如果您总是想用具有相同名称的新点覆盖旧点,则无需检查列表中是否存在该点。调用
pointMap.put(key,object)
将始终使用相同的键替换对象。

如果序列不重要,则可以使用
HashMap
唯一标识它们

HashMap<String, Point> pointMap = new HashMap<>();
String hoodName = jsonObject.getString("hood_name");
Point point = new Point(jsonObject.getString("hood_name"),
                  jsonObject.getDouble("points"),
                  jsonObject.getInt("hood_id"))
if (!points.containsKey(hoodName)) pointMap.put(hoodName, point);
HashMap pointMap=newhashmap();
String hoodName=jsonObject.getString(“hood_name”);
Point=新点(jsonObject.getString(“hood_name”),
jsonObject.getDouble(“点”),
jsonObject.getInt(“hood_id”))
如果(!points.containsKey(hoodName))pointMap.put(hoodName,point);

事实上,如果您总是想用具有相同名称的新点覆盖旧点,则无需检查列表中是否存在该点。调用
pointMap.put(key,object)
将始终使用相同的键替换对象。

正如您在注释中提到的,顺序并不重要,我会有一个
HashSet
来存储和检查
hood\u name
,如果你想通过输入
hood\u name
来获取
对象,你可以使用
HashMap,就像你在评论中提到的那样,顺序无关紧要,我会有一个
HashSet
来存储和检查
hood\u name
,如果你想通过输入
hood\u name
来获取
对象,你可以使用
HashMap在这种情况下,Points对象使用默认的
equals()
方法,这是不一致的。当您想使用
contains
方法时,应该像这样实现
equals()
方法

public class Points {

    String hoodName;
    Double points;
    Integer hoodId;

    public Points(String hN, Double p, Integer hI) {
        hoodName = hN;
        points = p;
        hoodId = hI;
    }

    public Double getPoints() {
        return points;
    }

    public Integer getHoodId() {
        return hoodId;
    }

    public String getHoodName() {
        return hoodName;
    }


    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Points)) {
            return false;
        }
        Points points = (Points) obj;

        return points.getHoodName().equals(getHoodName().trim()) &&
                points.getHoodId() == getHoodId()
                && points.getPoints() == getPoints();


      }

    }

如果使用
ovverride
equals()
方法,则可以在
ArrayList
中轻松使用它。希望它能在你的情况下起作用

在这种情况下,Points对象使用默认的
equals()
方法,这是不一致的。当您想使用
contains
方法时,应该像这样实现
equals()
方法

public class Points {

    String hoodName;
    Double points;
    Integer hoodId;

    public Points(String hN, Double p, Integer hI) {
        hoodName = hN;
        points = p;
        hoodId = hI;
    }

    public Double getPoints() {
        return points;
    }

    public Integer getHoodId() {
        return hoodId;
    }

    public String getHoodName() {
        return hoodName;
    }


    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Points)) {
            return false;
        }
        Points points = (Points) obj;

        return points.getHoodName().equals(getHoodName().trim()) &&
                points.getHoodId() == getHoodId()
                && points.getPoints() == getPoints();


      }

    }

如果使用
ovverride
equals()
方法,则可以在
ArrayList
中轻松使用它。希望它能在你的情况下起作用

hoodName只是列表中的一个属性,您不能用对象的一个属性检查contain,创建
对象,覆盖
中的equals方法,那么您的代码将被处理。另外,查看您的代码,点的顺序似乎并不重要?在这种情况下,使用Map或HashMap可能会更好。@tingyik90否序列不重要可能重复“执行类似于hoodName的操作”只是列表中的一个属性,您不能用对象的一个属性选中“包含”,即创建
对象,在
点中重写等于方法
那么你的代码也会被处理,那么,看看你的代码,点的顺序似乎并不重要?在这种情况下,使用Map或HashMap可能会更好。@tingyik90否序列不重要可能重复执行类似于Aw的操作。。你赢了我(啊..你赢了我..):(