Java 遍历对象的arraylist并从重复对象中获取最大数量值

Java 遍历对象的arraylist并从重复对象中获取最大数量值,java,android,arraylist,collections,Java,Android,Arraylist,Collections,我有这个产品对象的数组列表。我正在做的是点击+按钮,我正在制作一个产品对象,并从ui设置所有属性;包括“数量”并将此对象添加到ArrayList。现在,当我单击+按钮添加单个对象时,我会得到具有所有相同属性的重复产品对象,当然,“数量”计数除外。如果我添加一个数量为4的乘积,我会在arraylist中得到4个不同数量为1、2、3和4的乘积对象。我只希望集合中有数量最大的产品对象。我使用了比较器来解决这个问题,但我在这里做错了什么。请帮我找出我做错了什么。谢谢下面是从代码片段中排除getter和s

我有这个产品对象的数组列表。我正在做的是点击+按钮,我正在制作一个产品对象,并从ui设置所有属性;包括“数量”并将此对象添加到ArrayList。现在,当我单击+按钮添加单个对象时,我会得到具有所有相同属性的重复产品对象,当然,“数量”计数除外。如果我添加一个数量为4的乘积,我会在arraylist中得到4个不同数量为1、2、3和4的乘积对象。我只希望集合中有数量最大的产品对象。我使用了比较器来解决这个问题,但我在这里做错了什么。请帮我找出我做错了什么。谢谢下面是从代码片段中排除getter和setter的产品模型

产品:

private String category;
private String code;
private String description;
private String units;
private String weight;
private Integer tax;
private String pieces;
private Integer aliasFlag;
private Double price;
private Integer quantity;
private Integer taxAmount;
private Double totalAmount;
到目前为止,我正在使用Comparator比较两个或多个(根据数量计数)产品对象:

Collections.sort(mProductsToBeSent, new Comparator<Products>() {
                @Override
                public int compare(Products ob1, Products ob2) {
                    if (ob1.getCode().equals(ob2.getCode())) {
                        if (ob1.getQuantity()<ob2.getQuantity()){
                            mProductsToBeSent.remove(ob1);
                        }
                    }
                    return 0;
                }
            });
Collections.sort(MPProductsToBesent,新的Comparator(){
@凌驾
公共整数比较(产品ob1、产品ob2){
if(ob1.getCode().equals(ob2.getCode())){

如果(ob1.getQuantity()您可以执行以下操作:

mProductsToBeSent.stream()
      .collect(Collectors.groupingBy(Product::getCode,
               Collectors.maxBy(Comparator.comparing(Category::getQuantity))));
您将获得地图
map
,现在可以通过以下方式将其转换为
列表

yourObtainedMap.entrySet()
     .stream().map(entry -> entry.getValue().get())
     .collect(Collectors.toList())

排序时不能从列表中删除元素

作为一个比较者,我会这样做:

new Comparator<Products>() {
                @Override
                public int compare(Products ob1, Products ob2) {
                    if (ob1.getCode().equals(ob2.getCode())) {
                        if (ob1.getQuantity()<ob2.getQuantity()){
                            return -1;
                        } else if (ob1.getQuantity()<ob2.getQuantity()){
                            return 1;
                        } else {
                            return 0;
                        }
                    }
                    return 0;
                }
            }
更新:

但如果您按产品代码对列表进行排序,则可以在添加数量时删除重复项:

private static final Comparator<Products> PRODUCTS_CODE_COMPARATOR = new Comparator<Products>() {
                    @Override
                    public int compare(Products ob1, Products ob2) {
                        return ob1.getCode().compareTo(ob2.getCode());
                    }
                };

通常的方法不是用另一个数量值将不同的产品添加到列表中,而是从列表中取出产品并更新其数量


作为答案编写,因为我不能只是注释,我认为这会对您有所帮助。

比较器应该进行比较。它应该返回一个正整数、0或负整数,这取决于两个比较对象中哪个最大。它不应该从任何集合中删除任何内容,也不应该总是返回0.不要使用sort()除了排序之外,不要使用比较器来做其他事情。要尊重Java命名约定。如果你需要帮助,你应该用示例输入和输出准确地描述你想要做的事情。关于排序,你是对的。我知道Java命名约定。只是我在使用Gson库来转换将我的Java obejcts转换为Json表示并将其发送到api。在我的Json表示中,后端团队将使用这些键向我发送数据,因此我被迫按照相同的变量名创建模型。这样命名对我来说甚至很尴尬。感谢您的回复,我将寻找另一种可能的解决方案。我阅读了您的问题几篇文章imes和我仍然不明白你想要什么。你想删除重复项还是什么?打破惯例不是解决Gson问题的正确方法。第一个(Gson)自定义属性名称的google结果"是的。当然,还有文档。为什么没有人阅读文档?排序时不能从列表中删除元素。请解释原因。@nullpointer好吧,我还没有编写JVM的排序方法,但是如果我正在编写,我当然不希望比较器产生删除元素的副作用如果(ob1.getCode().equals)(ob2.getCode()),那么
问题中的这个逻辑?@nullpointer-哦,是的,没有注意到。然后你就按
code
对它们进行分组。我更新了它,谢谢。@mondoteck,谢谢你的解决方案,不幸的是,我不能在我的android应用程序中使用流媒体,因为使用Java 8功能有限制;其中一些功能。但我找到了一些第三方库我很抱歉没有提到“Android”标签。@whenthemorningcomes-Java 8功能已经在Android中引入了很长一段时间了。你只需要启用
jackOptions
,在谷歌上搜索你可以怎么做。嗨,根据你的建议,我对流量做了一些更改,我得到了想要的输出t、 谢谢,伙计。
private static final Comparator<Products> PRODUCTS_CODE_COMPARATOR = new Comparator<Products>() {
                    @Override
                    public int compare(Products ob1, Products ob2) {
                        return ob1.getCode().compareTo(ob2.getCode());
                    }
                };
int pos = Collections.binarySearch(mProductsToBeSent, obj, PRODUCTS_CODE_COMPARATOR);

if (pos >= 0) {
    // already in the list
    Products obj2 = mProductsToBeSent.get(pos);
    obj2.setQuantity(obj2.getQuantity() + obj.getQuantity());
} else {
    // not found: insert obj
    mProductsToBeSent.add(-pos-1, obj);
}