我已经制作了我自己的自定义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<Integer>
时,此代码正常工作,但在我使用ArrayList<Points>
任何人都可以解释我如何避免在我的列表中重复吗?
答案 0 :(得分:2)
正如您在评论中提到的那样,订单并不重要,我会HashSet<String>
存储并检查hood_name
,如果您想通过输入object
hood_name
您可以使用HashMap<String,Point
代替O(1)
时间返回对象。
所以你需要创建一个HashSet<String>
来跟踪hood_name
中存在的所有对象的ArrayList<Points>
。
HashSet<String> all_ids=new HashSet<String>();
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()
和Point
方法。有关更多信息,请参阅this。
答案 1 :(得分:1)
如果序列不重要,那么您可以使用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);
事实上,如果您总是希望使用具有相同hoodName
的新点覆盖旧点,则无需检查列表中是否存在Point
。调用pointMap.put(key, object)
将始终使用相同的键替换该对象。
答案 2 :(得分:1)
在这种情况下,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>
中轻松使用它。希望它适用于您的情况。