2014-09-27 26 views
0

我有一個名爲Bag2的類,它有一個名爲Item的內部類。 Bag2具有變量ArrayList aList和稱爲「add」的函數。它通過重複添加重複值來添加錯誤。ArrayList <Item>(其中Item是內部類)添加錯誤

這裏是我的代碼:

import java.util.ArrayList; 
public class Bag2 { 

public Bag2(){}; // Constructor 

/** 
* Inner class 
* 
*/ 
public class Item implements Comparable<Item> { 

    String name; 
    int quantity; 

    public Item(String name, int quantity) { // Constructor 
     this.name = name; 
     this.quantity = quantity; 
    } 

    @Override 
    public String toString() { 
     return name + " : " + quantity; 
    } 


    @Override 
    public int compareTo(Item o) { 
     return name.compareToIgnoreCase(o.name); 
    } 

} 

public ArrayList<Item> aList = new ArrayList<>(); 

public void add(String itemName){ 

    Bag2 bag2 = new Bag2(); 
    Bag2.Item item = bag2.new Item(itemName.toUpperCase(), 1); 

    if (aList.isEmpty()){ 
     aList.add(item); 
    } else 
    { 
     for(int i = 0; i < aList.size();i++){ 
      if (item.compareTo(aList.get(i))==0){ 
       aList.get(i).quantity++; 
      }else { 
       aList.add(item); // Built inn add-function 
       break; // add one time only and the size increases 
      } 
     } 
    } 

} 


} 

這裏是我的測試:

public class Bag2Test { 

public static void main(String[] args) { 
    Bag2 bag = new Bag2(); 

    Bag2.Item[] anArray = 
     { 
     bag.new Item("A", 1), 
     bag.new Item("B", 1), 
     bag.new Item("C", 1), 
     bag.new Item("D", 1), 
     bag.new Item("a", 1), 
     bag.new Item("F", 1), 
     bag.new Item("b", 1), 
     bag.new Item("e", 1), 
     bag.new Item("a", 1) 

     }; 

    for (int i = 0; i<anArray.length; i++){ 
     bag.add(anArray[i].name); // 
    } 

    System.out.println("\nA list contains : "); 
    for (int i = 0; i<bag.aList.size(); i++) { 
     System.out.println(bag.aList.get(i)); 
    } 

} 
} 

輸出:

列表包含: 答:3 B:1 Ç :1 D:1 A:1 F:1 B:1 E:1 答:1個

+0

Item類應該是靜態的。它不使用任何外部對象的方法領域。這就是說,你應該問一個問題。 – 2014-09-27 15:24:08

+0

你內心的課堂使用令人不安。如何使Item成爲靜態類?我強烈建議使用調試器並逐步執行「add」方法。你會很快知道發生了什麼。 – Holger 2014-09-27 15:30:30

回答

1

add功能被打破,因爲它可以觸發聲明if (item.compareTo(aList.get(i))==0)一個i價值,仍然將其添加爲另一個值。雖然有更優雅和強大的解決方案爲您的計劃,包括覆蓋equals()hashCode()和使用Set而不是列表,這將導致一個通用的袋實現,我發佈了最短的修復程序爲您的問題。

public void add(String itemName) 
{ 
    Bag2 bag2 = new Bag2(); 
    Bag2.Item item = bag2.new Item(itemName.toUpperCase(), 1); 

    if (aList.isEmpty()) 
    { 
     aList.add(item); 
    } else 
    { 
     boolean existing = false; 
     for(int i = 0; i < aList.size();i++) 
     { 
      if (item.compareTo(aList.get(i))==0) 
      { 
       aList.get(i).quantity++; 
       existing=true; 
       break; 
      }    
     } 
     if(!existing) {aList.add(item);} 
    } 
} 
0

假設你加的下列項目:A,B,C

現在您的列表是:答:1,B:1,C:1

在你添加檢查當前項目是否相同的邏輯,否則添加項目。因此,如果我們現在嘗試再次添加項目C,您的列表將如下所示:A:1,B:1,C:1,C:1

這是因爲您正在逐項檢查項目。在添加新項目之前,您需要檢查它是否不存在於整個列表中,然後才添加它。 (例如當添加Ç於上述列表中的第一循環迭代(i=0)將執行在else塊中的代碼,因爲Ç是不同的並且Ç將被添加儘管它在列表中存在)

相關問題