1

我有三个 ArrayList,两个是字符串,最后一个是整数。

第一个 ArrayList 包含特定产品的特定变体 (variantArray),例如可乐的风味变体,第二个包含单元 (unitArray),其中包含产品的尺寸 (80oz、500mL、1L) 等单位,以及最后一个是数量 *(quantityArray)。

这是我使用的类。

public class CurrentOrderClass {

  //ArrayLists
  private ArrayList<String> variantArray = new ArrayList<String>();
  private ArrayList<String> unitArray = new ArrayList<String>();
  private ArrayList<Integer> quantityArray = new ArrayList<Integer>();


  //TODO ArrayList functions
  public ArrayList<String> getUnitArray() {
      return unitArray;
  }

  public void setUnitArray(ArrayList<String> unitArray) {
      this.unitArray = unitArray;
  }

  public void addToUnitArray(String unit){
      this.unitArray.add(unit);
  }



  public ArrayList<Integer> getQuantityArray() {
      return quantityArray;
  }

  public void setQuantityArray(ArrayList<Integer> quantityArray) {
      this.quantityArray = quantityArray;
  }

  public void addToQuantityArray(int quantity){
      this.quantityArray.add(quantity);
  }

  public ArrayList<String> getVariantArray() {
      return variantArray;
  }

  public void setVariantArray(ArrayList<String> variantArray) {
      this.variantArray = variantArray;
  }

  public void addToVariantArray(String variantArray){
      this.variantArray.add(variantArray);
  }


  @Override
      public String toString() {
         return "[ product=" + productName + ", variants=" + 
            variants + " , unit=" + unit + " , quantity=" + quantity + "]";
      }

}

我接受用户输入,因此用户选择 Variant、Unit 和 Quantity,然后将输入存储在各自的 ArrayList 中。

但是,当用户输入 ArrayLists 中已经存在但数量不同的 Variant 和 Unit 时,我在更新 ArrayLists 时遇到问题。我想要做的不是添加新条目,而是更新当前的 ArrayLists,这样当用户输入变量和单位但数量不同时,我只会更新数量。

我尝试的第一件事是通过 using 查看输入是否已经存在于 ArrayList 中indexOf(userInputVariant),然后检查它是否与 a 匹配indexOf(userInputUnit),这意味着用户输入已经重复。但是,我不认为 indexOf 在该逻辑上运行,它返回的值是它找到userInputVariant字符串的第一个实例的值。

我尝试的第二次尝试是使用 for each 循环,但是,我再次很难正确返回我想要的索引。

我实例化了一个CurrentOrderClass命名的对象,currentOrder并用“Grape”预填充了它的variantArray的前10个元素

之后,我尝试了这个 if-else 语句:

if( (currentOrder.getVariantArray().indexOf(product.getVariant()[variantPosition]) ==
     currentOrder.getUnitArray().indexOf(product.getUnit()[position]) 

但是,如上所述, indexOf 返回一个 int ,它首先找到了我告诉它要查找的 String ,我认为它不会检查它是否在该特定位置之后存在。

我尝试的第二个代码是使用 for-each 并从那里返回位置,但同样,它只返回位置 = 0。

for( String Grape : currentOrder.getVariantArray() ){
      Log.d("Angelo", "Retrived Element: " + Grape 
           + " at position = " + currentOrder.getVariantArray().indexOf(Grape));
}

我目前正在考虑在 for-each 循环中运行 for-each 循环,但我不知道如何让它返回我想要的正确位置。

有没有人知道如何使它正常工作?我需要通过与我的 unitArray 进行“交叉引用”来返回在我的 variantArray 中多次出现的项目的位置。谢谢。

4

2 回答 2

3

在这种情况下,一个 for 循环就足够了。

这将类似于:

isExist = false;
for(index = 0; index<variantArray.size(); index++){
    if(variantArray.get(index) == userChoiceVariant &&
        unitArray.get(index) == userChoiceUnit){
        //update quantity
        isExist = true;
    }
}
if(!isExist){
    //insert order
}
于 2013-08-01T03:52:24.537 回答
0

我达到的第一个解决方案是:“在变体数组中搜索与用户输入匹配的所有索引,将其存储在另一个中ArrayList<Integer>,暂时命名matchingVariants。然后,对于每个 intmatchingVariants获取单位列表的位置。如果其中一项匹配,则应更新,否则插入。

但是,我认为更好的解决方案是将 Variants 和 Units 包装在一个类中,例如Product使用属性String variantString unit. 实施equals方法,您可以忘记您的变体和单位列表,并且只有一个ArrayList<Product>

下一步,我将使用MapwithProduct作为键和Integer值。所以我可以更新Map而不是拥有你拥有的所有列表。

于 2013-08-01T04:02:13.090 回答