2017-04-16 32 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>使用它。希望它能適用於你的情況。