【问题标题】:Check if array of objects contains object with the same attribute检查对象数组是否包含具有相同属性的对象
【发布时间】:2023-03-26 05:35:01
【问题描述】:

嘿,所以我正在做一个使用 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。现在代码实际上并没有增加对象的计数,它总是向列表中添加一个新对象,有没有办法可以检查对象列表中是否有相同的条形码,然后相应地增加计数?

编辑:好的,感谢您的回答,我实际上设法解决了它。忘记提及条形码属性是字符串类型,并且还忘记了您不会将字符串与== 而是与equals 进行比较这一事实。很抱歉,谢谢大家抽出时间来帮助我。

【问题讨论】:

  • 条码会员有什么类型?请展示我们需要的所有代码以了解可能出现的问题
  • 检查this
  • 'item.barcode' 的类型是什么?需要知道这一点才能回答。
  • @Teemu Rytsölä 根据您的编辑问题below 应该是答案

标签: java android arrays list object


【解决方案1】:

你可以通过这条路,

    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

【讨论】:

    【解决方案2】:

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

    1. 为每种类型设置一个唯一的 Id 并检查它是否相同。
    2. 覆盖 BarcodeItem 中的 equals 方法并检查使它们成为相同项目的任何参数。

    contains 也调用对象中的等号,只要您不在 BarcodeItem 对象中覆盖它,它将返回与“==”运算符相同的值

    【讨论】:

    • 如果条形码是基元(int 或类似)怎么办?在某些情况下 == 是合适的
    • @Stultuske,是的。如果您正在竞争 int == int ,它将检查这些值。但是,如果您检查对象(也包括字符串),则需要覆盖 equals 方法。例如,String 不是原始类型,如果要比较字符串的文本,则需要执行 String.equals("test")。
    • 原语,枚举,......还有其他例子。当然,equals 的需要很可能是这里的问题,但很难确定,不知道要比较的类型
    • @Stultuske,从他的代码来看,他正在做 new BarcodeItem() 所以它是一个对象。
    • 我看到了,但他不是比较barcodeItem,而是barcodeItem中的条形码
    【解决方案3】:

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

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

    比使用List.contains() 方法。

    【讨论】:

    • 哪个不行,否则他当前的代码可以工作。
    猜你喜欢
    • 2012-02-02
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2020-06-07
    • 2018-03-08
    相关资源
    最近更新 更多