Java / Kotlin:Bug算法重复对象

时间:2018-04-12 10:40:09

标签: java android kotlin

我有一个Products对象,其中包含ID,NAME,QUANTITY。

我有一个arraylist对象类型的产品,可能是在arraylist中同一产品出现了好几次但数量不同。

我想将所有相同ID的产品合并到一个产品中并累积数量。

例如,我有一个产品:

Id: 1
Name: Computer
Qty: 3

另一个:

Id: 1
Name: Computer
Qty: 7

我想汇总并删除arrayList中的重复项 结果:

Id: 1
Name: Computer
Qty: 10

这是我的代码,但它不能完全正常工作......

var j = 0
    for (i in 0 until products.size) {
        while (j < products.size) {
            if (i != j) {
                if (products[i].id == products[j].id) {
                    val totalQty = products[i].amountProduct + products[j].amountProduct
                    products[i].amountProduct = totalQty
                    products.remove(products[j])
                    j--
                }
            }
            j++
        }

        try {
            products[i].priceHT = products[i].price * products[i].amountProduct
        } catch (e: RuntimeException) {
            loge(e.message.toString())
        }

    }

3 个答案:

答案 0 :(得分:1)

我会用Java回答,因为我不熟悉Kotlin。我看到你正在使用数组。我建议改为使用hashmap:

HashMap<Integer, Integer> productCount = new HashMap<Integer, Integer>();

for (i = 0; i < products.size; i++) {
    int key = products[i].id;
    int count = productCount.getOrDefault(key, 0);
    productCount.put(key, count + products[i].quantity);
}

答案 1 :(得分:0)

您正在迭代它时从products列表中删除元素。

考虑您是否有列表[a, b, c, d]。您的索引i0,您删除该元素。现在,列表变为[b,c,d],您将i增加到1。所以迭代的下一个元素是c ...你只是跳过 b

解决此问题的一种方法是将列表从最后一个元素迭代到第一个元素(从d开始,然后返回到a)。这样,当您删除d时,不会跳过列表中的任何元素。

答案 2 :(得分:-1)

使用这段java代码。这将完成你的工作,但它在java。

 public void removeDuplicates() {

    for (int i = 0; i < products.size(); i++) {
        for (int j = i + 1; j < products.size(); j++) {
            if (products.get(i).getId().equals(products.get(j).getId())) {
                int totalQty = products.get(i).getQty() + products.get(j).getQty();
                products.get(i).setQty(totalQty);
                products.remove(j);
                j--;


            }


        }

    }

}