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

时间:2017-04-16 10:37:44

标签: 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 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>

时则不行

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

3 个答案:

答案 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>中轻松使用它。希望它适用于您的情况。