在自定义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
轻松使用它。 希望它适用于您的情况。