Android - 返回多次出现的ArrayList中项目的位置

时间:2013-08-01 02:56:22

标签: android arraylist

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

第一个ArrayList包含特定产品的特定Variant(variantArray),如可乐的风味变体,第二个包含Unit(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,然后将输入存储在各自的ArrayLists中。

但是,当用户输入一个已存在于ArrayLists中但仅具有不同数量的Variant和Unit时,我在更新ArrayLists时遇到问题。我想要做的不是添加新条目,而是以这样的方式更新当前的ArrayLists:当用户输入变量和单位但数量不同时,我只更新数量。

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

我尝试的第二次尝试是为每个循环使用a,但是,我再一次很难恢复我想要的索引。

我实例化名为CurrentOrderClass的{​​{1}}的对象,并使用“Grape”预先填充其variantArray的前10个元素

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

currentOrder

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

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

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

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

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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

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

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