在自定义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 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时则不行

任何人都可以解释我如何避免我的列表中的重复?

正如你在评论中提到的Order无关紧要,我会有一个HashSet来存储和检查hood_name ,如果你想通过输入hood_name来获取object ,你可以使用HashMap而不是返回对象在O(1)时间。

因此,您需要创建一个HashSet ,它将跟踪ArrayList存在的所有对象的hood_name

 HashSet all_ids=new HashSet(); if (!all_ids.contains(jsonObject.getString("hood_name"))) { points.add(new Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id"))); all_ids.add(jsonObject.getString("hood_name")); //You need to add it to set as Now it exists in the list. } 

此外,如果您只想使用ArrayList来执行此任务,您可以在Point类中重写equals(Object E)hashCode()方法。 有关更多信息,请参阅此处 。

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

 HashMap 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); 

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

在这种情况下,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轻松使用它。 希望它适用于您的情况。