2010-10-10 62 views
0

我只是想知道如何,如果一個Hashmap已經在列表中添加1到數量,如果它不是然後將它添加到列表。這就是我所做的,只是添加事件,即使該項目已經在列表中。正在更新清單<HashMap>

list = new ArrayList<HashMap<String, String>>(); 
Cursor c = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + txtCode.getText().toString(), null); //search database 
       if (c.moveToFirst()){ //if successful 
        txtDesc.setText(c.getString(1)); //get desc 
        txtPrice.setText(c.getString(2)); // get price @ database 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("desc", c.getString(1)); 
        map.put("price", c.getString(2)); 
        map.put("quantity","1"); 
        list.add(map); 
        adapter.notifyDataSetChanged(); 
+0

你真的試圖用這個來實現什麼?如果你解釋你想解決什麼問題,那麼理解你的代碼可能會更容易。因爲截至目前,它沒有太大意義... – Nailuj 2010-10-10 16:18:29

+0

請看看我的解決方案下面。在列表中添加項目之前,我想知道它是否已經存在,如果不存在,請在列表中添加項目(如果已存在),將其散列圖「數量」更新爲2,等等。 – 2010-10-10 16:33:35

+0

在撰寫我的第一條評論時,我已經在下面看過您的解決方案。我再說一遍:你真的想用這個來達到什麼目的?你的代碼不容易閱讀(代碼似乎是更大環境的一部分),所以很難理解,因此很難幫助你。爲什麼例如你在'ArrayList'中有幾個'HashMap'?你是否試圖總結一些東西?因爲如果是這樣的話,我覺得我錯過了一個循環或其他東西......嘗試清理你的代碼並澄清你的問題(也許用一個具體的例子),然後我們可以幫助你。 – Nailuj 2010-10-10 17:19:28

回答

0

從你上次的評論中,我想我會看到你想要做的。首先,我會創建一個小類來保存關於項目的信息,使它更容易處理(我只實現了必要的設置器,您可能還需要一些getter(以及其他函數)):

public class MyItem 
{ 
    String description; 
    float price; 
    int quantity; 

    public void setDescription(String description) 
    { 
     this.description = description; 
    } 

    public void setPrice(float price) 
    { 
     this.price = price; 
    } 

    public void setQuantity(int quantity) 
    { 
     this.quantity = quantity; 
    } 

    public void increaseQuantity() 
    { 
     this.quantity++; 
    } 

    @Override 
    public int hashCode() 
    { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((description == null) ? 0 : description.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     MyItem other = (MyItem) obj; 
     if (description == null) 
     { 
      if (other.description != null) 
       return false; 
     } 
     else if (!description.equals(other.description)) 
      return false; 
     return true; 
    } 
} 

我有實現equals方法(以及常見的是隨後也實現hash方法)能夠容易地檢查是否在列表中存在(爲簡單起見一個項目,我假定description唯一地標識一個項目,你應該根據需要改變它)。然後,您可以與您的處理繼續像這樣:

public void queryForItem(String itemCode) 
{ 
    Cursor cursor = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + itemCode, null); 
    if (cursor.moveToFirst()) 
    { 
     processCursor(cursor); 
    } 
    cursor.close(); 
} 

private void processCursor(Cursor c) 
{ 
    MyItem newItem = new MyItem(); 
    newItem.setDescription(c.getString(1)); 
    newItem.setPrice(c.getFloat(2)); 
    newItem.setQuantity(1); 

    // assuming that items (ArrayList<MyItem>) is defined and initialized earlier in the code 
    int existingItemIndex = items.indexOf(newItem); 
    if (existingItemIndex >= 0) 
    { 
     items.get(existingItemIndex).increaseQuantity(); 
    } 
    else 
    { 
     items.add(newItem); 
    } 
    adapter.notifyDataSetChanged(); 
} 

我沒有以任何方式進行測試,但我的事情應該做你想要什麼。希望你能看到它的邏輯:)

+0

感謝您的幫助,但我的arraylist聲明爲:list = new ArrayList >();在list.get(existingItemIndex).increaseQuantity(); – 2010-10-11 16:28:46

+0

我會嘗試修改並將其應用於我的代碼。謝謝 。 – 2010-10-11 16:36:37

+0

我試圖申請但仍然。它只會在第三次更新2次時創建一個新的同樣的列表項。如果項目存在,我認爲邏輯錯誤出現在搜索中。因爲在代碼上。它搜索列表中的項目A,數量= 1,所以在它更新到項目A後,數量= 2.它不能搜索項目A與數量1,因此它創建一個新的列表項目A,數量= 1等等 – 2010-10-11 16:56:00

0

我想出了這個解決方案,但是如果一個項目存在,只有更新數量3日2次嘗試用相同的遞減,價格不過1個數量創造了新的列表項。

Cursor c = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + txtCode.getText().toString(), null); //search database 
      if (c.moveToFirst()){ //if successful 
       txtDesc.setText(c.getString(1)); //get desc 
       txtPrice.setText(c.getString(2)); // get price @ database 
       HashMap<String, String> map = new HashMap<String, String>(); 
       map.put("desc", c.getString(1)); 
       map.put("price", c.getString(2)); 

if(list.isEmpty()){ 
        map.put("quantity","1"); 
        list.add(map); 
        adapter.notifyDataSetChanged(); 
       } 
       else{ 
        if(list.contains(map)){ 
         int loc = list.indexOf(map); 
         Object o = list.get(loc); 
         @SuppressWarnings("unchecked") 
         HashMap<String, String> map2 = (HashMap<String, String>)o; 
         String b = (String) map2.get("quantity"); 
         int quantity = Integer.parseInt(b) + 1; 
         map2.put("quantity", Integer.toString(quantity)); 
         adapter.notifyDataSetChanged(); 

        } 
        else{ 
         map.put("quantity","1"); 
         list.add(map); 
         adapter.notifyDataSetChanged(); 
        }