检查对象数组是否包含具有相同属性的对象

时间:2017-09-07 07:37:22

标签: java android arrays list object

嘿所以我正在研究使用google vision api的小项目,重点是阅读条形码并列出它们。 我希望能够多次读取条形码,并且只增加我在barcodeItem对象数组中添加的相同“barcodeItem”对象的数量。

if(currentBarcode != null){
        boolean exists = false;
        BarcodeItem barcodeItem = new BarcodeItem(currentBarcode);
        for (BarcodeItem item : MainActivity.barcodesList){
            if(item.barcode == barcodeItem.barcode){
                item.itemCount++;
                exists = true;
            } else {
                //do nothing to item
            }
        }
        if(exists == false){
            MainActivity.barcodesList.add(barcodeItem);
        }
        currentBarcode = null;
    } else { //do nothing 
}

我也尝试过使用contains。现在代码实际上并没有增加对象的数量,它总是在列表中添加一个新对象,有没有办法可以检查相同条形码的对象列表,然后相应地增加计数?

编辑:好的,谢谢你的答案,我实际上设法解决了这个问题。忘记提到条形码属性是String类型,并且忘记了你没有将字符串与==进行比较而是用equals进行比较。抱歉和谢谢所有人都抽出时间帮助我。

3 个答案:

答案 0 :(得分:0)

在Java中,当您在对象上使用“==”运算符时,您正在检查它是否是同一个对象实例。这不是每次都创建新项目。 您有两种选择:

  1. 为每种类型都有一个唯一的ID,并检查它是否相同。
  2. 覆盖BarcodeItem中的equals方法,并检查使它们成为同一项的任何参数。
  3. contains也会在对象中调用equals,所以只要你不在BarcodeItem对象中覆盖它,它就会返回与“==”运算符相同的

答案 1 :(得分:0)

您的属性可能不是原始数据,因此您还应该覆盖属性的equals()方法。除此之外, 将BarcodeItem的equals()方法重写为:

    @Override
public boolean equals(Object obj) {
...
BarcodeItem bi=(BarcodeItem)obj;
if(bi.getYourAttribute.equals(this.yourAttribute))
return true;
}

而不是使用List.contains()方法。

答案 2 :(得分:0)

你可以通过这种方式,

    for (int i = 0; i < MainActivity.barcodesList.size(); i++) {
        if (MainActivity.barcodesList.get(i).getBarcodeNo().equalsIgnoreCase(currentBarcode)) {
            Toast.makeText(this, "Duplicate QR Code : " + currentBarcode, Toast.LENGTH_SHORT).show();
            return;
        }
    }
    BarcodeModel bm = new BarcodeModel();
    bm.setBarcodeNo(currentBarcode);
    MainActivity.barcodesList.add(bm);

你的计数将是

    MainActivity.barcodesList.size() + 1