【问题标题】:How to modify add of ArrayList如何修改 ArrayList 的添加
【发布时间】:2014-12-28 21:38:59
【问题描述】:

我正在尝试修改“添加”方法,以便检查 BinItem 的 SKU 是否相同。如果它是独一无二的,我会添加它。如果它的 SKU 与其他 SKU 相似,它将删除 BinItem,创建一个新的(相同 SKU)但汇总数量。

我尽了最大的努力,但无法理解它......这是我的努力。我尝试制作一个嵌套的 for 循环,以便遍历每个循环,检查它们是否相同,如果它们相同则删除。它最终删除了所有内容。

public class Bin
{
   private String myName;
   private ArrayList<BinItem> myContents; 

   public Bin ( String name )  
   {  
      myName = name; 
      myContents = new ArrayList <BinItem>();  
   }

   public ArrayList <BinItem> getContents()  
   {
      return myContents; 
   }

   public String getName() 
   { 
      return myName;  
   }


  // Define the remove and totalQuantity methods and redefine the add method here

   public void remove (int b)
   {
      myContents.remove(b);
   }

   public int totalQuantity()
   {
      int x = 0;
      for (int i = 0; i< myContents.size(); i++)
      {
          x += myContents.get(i).getQuantity();
      }
      return x;
   }

   public void add (BinItem b)
   {
     for (int i = 0; i < myContents.size(); i++)
     {
         for (int x = 0; x < myContents.size(); x++)
         {
             if (!(myContents.get(i).getSKU().equals(myContents.get(x).getSKU())))
             myContents.add(b); 
             else 
             myContents.remove(b);
         }
     } 
   }

   public String toString() 
   {
      String s = "Bin " + myName + ":\n";
      for ( BinItem b : myContents ) 
          s += b + "\n"; 
      return s;
   }
}

这是 BinItem 类

public class BinItem
{
   private String mySKU; 
   private int myQuantity;

   public BinItem ( String sku, int quantity)   
   {   
       mySKU = sku;   
       myQuantity = quantity;   
   }

   public String getSKU()   
   {    
       return mySKU;  
   }

   public int getQuantity()  
   {  
       return myQuantity;  
   }    

   public String toString()  
   {  
       return "SKU " + getSKU() + ": " + getQuantity();  
   }
}

这是主类

public static void main( String[] args )
{
    Bin bin = new Bin( "A" );
    bin.add( new BinItem( "1234-0", 500 ) );
    bin.add( new BinItem( "1234-1", 25 ) );
    bin.add( new BinItem( "1234-0", 243 ) );
    bin.add( new BinItem( "1234-2", 7720 ) );
    bin.add( new BinItem( "1234-0", 871 ) );
    System.out.println( bin );
}

我正在努力让它返回

Bin A:
SKU 1234-1: 25
SKU 1234-2: 7720
SKU 1234-0: 1614

【问题讨论】:

  • 您应该只需要遍历列表一次,如果找到它就中断循环。 然后如果你有一个找到的参考增加计数。
  • 为什么要删除旧条目而不只是总结数量?列表中的位置是否起作用?
  • 如果不需要排队的位置,则使用 HashMap 比 List 搜索更好,否则使用 TreeMap。

标签: java arraylist


【解决方案1】:

如果您只想检查列表是否包含具有特定 sku 的 BinItem,您可以覆盖 BinItem 类中的 equals 方法。

public override boolean equals(Object obj){
    if(!(obj instanceof Bin)) return false;
    Bin b = (Bin) obj;
    return b.getSKU().equals( getSKU());
}

您需要检查 obj 是否为 Bin 对象,否则如果传递的 obj 不是 Bin 类型,您将收到错误消息。 然后在 Bin 类的 add 方法中,您将使用 myContents.contains( newObject)
检查列表是否包含该对象 如果列表已经包含 bin 项目,那么它将返回 true。此时,您可以获得列表中已经存在的项目的数量,然后将新对象的数量添加到其中。如果您只更改数量,则无需删除该项目并创建一个新项目。
只需添加一个addQuantity 方法并传入一个int;像这样:

public void addQuantity(int num){
    myQuantity += num;
}

要获取列表中已经存在的对象,您可以使用 indexOf(obj) 获取它的索引,然后使用 get 检索对象,然后将数量增加给定的数量。
事实上,您甚至不需要使用 .contains(),因为如果列表中不存在该对象,它将返回 -1,您可以像这样检查:

int index = myContents.indexOf( b );
if(index == -1){
    //Handle adding the item to the list.
}else {
    BinItem bi = myContents.get(index);
    bi.addQuantity( b.getQuantity() );
}

希望这对您有所帮助。

【讨论】:

    【解决方案2】:

    在您的 BinItem 类中,您可以覆盖 equals() 方法

    public boolean equals(Object obj) {
        BinItem b = (BinItem) obj ;
        return b.getSKU() == obj.getSKU(); 
    }
    

    然后使用public boolean contains(Object o)检查包含您的项目的列表

     public void add (BinItem b)
     {
    
        if (!myContents.contains(b))
          myContents.add(b);
        else { //Edit : Based on Anthony Forloney's comment
          // You should handle the quantity sum here based on your logic
          myContents.remove(b);
          myContents.add(b);
        }
     }
    

    【讨论】:

    • 如果objnull,那么这种方法是脆弱的。
    • @Makoto 应该在 equals 中检查 null 吗?确保它涵盖了原始方法的功能?
    • OP 还希望在将项目从 ArrayList 中删除之前保留上一个项目的数量。
    • @AnthonyForloney 没有注意到这一点,您认为这种方法可以优化或删除?
    • 你应该优化它,参考 cmets
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2023-03-23
    • 2011-10-28
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多