2013-02-08 46 views
1
Class Order 
{ 
    String name; 
    Order(String n) 
    { name = n; } 

//setter and getters of name 
} 

Order a = new Order("same"); 
Order b = new Order("same"); 
Order c = new Order("diff"); 

List<Order> nameList// a,b,c 

我想對象屬性值比較列表裏面

seperate list of Orders 
    List<Order> dupList// a,b 
    List<Order> nondupList// c 

現在我要檢查相同的名稱是否在「名稱列表」的多個訂單可用。

我實現了使用List的索引並與其他索引List Orders進行比較。

但有沒有其他更好的方法來實現這一點。

+0

當你找到同樣的名字時,你想要做什麼? –

+0

感謝您的回覆....我想將它們作爲單獨的列表 – sunleo

+0

因此,您希望將它們全部分開,或者只是複製?你能發佈一些給定輸入的預期輸出嗎? –

回答

1

也許另一種方式可能是 - 重寫hashCode方法和equals方法。在計算字符串名稱時生成hasCode。

public class Order { 
    String name; 

    public Order(String n) { 
     name = n; 
    } 

    // setter and getters of name 
    @Override 
    public int hashCode() { 
     int h = 0; 
     int len = name.length(); 
     for (int i = 0; i < len; i++) 
      h = 31 * h + name.charAt(i); 
     return h; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if(obj == null) 
      return false; 
     else if(this.hashCode() == obj.hashCode()) 
      return true; 
     return false; 
    } 
} 

...

List<Order> nameList = ...;// a,b,c 
Set<Order> nonDuplicate= new HashSet<Order>(nameList); 
+0

謝謝你的回答。 – sunleo

1

如果你想使用純Java的元素添加到列表,並用適當的比較sort它。然後遍歷列表,跟蹤前一個元素,做一個控制中斷;換句話說,如果元素與之前相同,那麼這兩個元素都是重複的。如果他們不是(或者是第一個),他們是候選人,你需要等待下一次檢查才能找到重複。

如果你不想排序,你可以添加元素到一個集,因爲它們出現;如果在添加元素之前它已經在集合中,您可以將其添加到重複集合中。您可以在兩套設備上進行檢查,或者從完整設備中刪除最後的重複設備。您可以使用任何集合,但由於Set具有快速包含方法,因此Set效率更高。

如果您可以使用庫,則可以使用Guava並將所有內容添加到多重集(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html)然後遍歷多重集,並且每個元素都有一個計數。

+0

謝謝,我會嘗試。 – sunleo

0

您可以使用Map>,獲取給定名稱的列表,如果爲null,則創建並放入,在該列表中添加當前順序。