2017-04-16 31 views
0

只有一次添加的项目我做了我自己的自定义的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>

谁能解释我如何能避免我的列表中的重复?

+2

hoodName是在列表中只有一个属性,你可以不检查包含与对象的一个​​属性,创建'Points'对象,覆盖等于在'Points'那么你的代码将被还曾 –

+0

方法,看你的代码,看起来像Point的顺序并不重要?在这种情况下,使用Map或HashMap可能会更好。 – tingyik90

+0

@ tingyik90没有顺序并不重要 –

回答

1

正如你在评论中提到,顺序并不重要,我将有一个HashSet<String>存储和检查hood_name,如果你想通过输入hood_name得到object可以使用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>来执行这个任务,您可以覆盖Pointequals(Object E)hashCode()方法。欲了解更多信息,请参阅this

+0

谢谢!这对我有用 –

+0

呃..你打我吧.. :( – tingyik90

0

如果顺序并不重要,那么你可以使用一个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)将始终用相同的密钥替换对象。

0

在这种情况下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(); 


     } 

    } 

如果ovverrideequals()方法,你可以很容易地在ArrayList<Points>使用它。希望它能适用于你的情况。