首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >生成包含两列筛选和求和数据的新列表

生成包含两列筛选和求和数据的新列表
EN

Stack Overflow用户
提问于 2019-09-04 05:32:56
回答 4查看 84关注 0票数 4

我有一个包含两列的列表,分别用于过滤、存储和productType,并且我需要生成一个合并了amount_1和amount_2的新列表。

代码语言:javascript
代码运行次数:0
运行
复制
    List<stock> allStock = new ArrayList<>();

    allStock.add(new stock("l1", "CAIXA", 1, 4));
    allStock.add(new stock("l1", "CABIDE", 1, 0));
    allStock.add(new stock("l1", "CAIXA", 5, 5));
    allStock.add(new stock("l1", "CABIDE", 1, 0));

    allStock.add(new stock("l2", "CAIXA", 1, 4));
    allStock.add(new stock("l2", "CABIDE", 1, 0));
    allStock.add(new stock("l2", "CAIXA", 5, 5));
    allStock.add(new stock("l2", "CABIDE", 1, 1));



public stock(String store, String productType, Integer amount_1, Integer amount_2);

我需要一个新的列表,比如:

l1,CAIXA,6,9

l1,CABIDE,2,0

l2,CAIXA,6,9

l2,CABIDE,2,1

EN

回答 4

Stack Overflow用户

发布于 2019-09-04 09:52:34

可以将、Collectors.toMap与在Stock类中显式定义的mergeFunction一起使用,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
List<Stock> resultingStocks = new ArrayList<>(allStock
        .stream()
        .collect(Collectors.toMap(st -> 
                        Arrays.asList(st.getStore(), st.getProductType()), 
                Function.identity(), 
                this::mergeStocks)) // explicit merging behaviour
        .values());

其中,mergeStocks定义在与以下内容相同的类中:

代码语言:javascript
代码运行次数:0
运行
复制
Stock mergeStocks(Stock stock1, Stock stock2) {
    return new Stock(stock1.getStore(), stock1.getProductType(), stock1
            .getAmount_1() + stock2.getAmount_1(), stock1.getAmount_2() + stock2.getAmount_2());
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-04 05:57:44

代码语言:javascript
代码运行次数:0
运行
复制
package ClassConcept;

import java.util.ArrayList;
import java.util.List;

public class stock {
    String s1,s2;
    int a1,a2;
    stock(String s1, String s2, int a1, int a2){
        this.s1 = s1;
        this.s2 = s2;
        this.a1 = a1;
        this.a2 = a2;

    }
}

public class ClassSpecifier {

    public static void main(String[] args) {

        List<stock> allStock = new ArrayList<>();

        allStock.add(new stock("l1", "CAIXA", 1, 4));
        allStock.add(new stock("l1", "CABIDE", 1, 0));
        allStock.add(new stock("l1", "CAIXA", 5, 5));
        allStock.add(new stock("l1", "CABIDE", 1, 0));

        allStock.add(new stock("l2", "CAIXA", 1, 4));
        allStock.add(new stock("l2", "CABIDE", 1, 0));
        allStock.add(new stock("l2", "CAIXA", 5, 5));
        allStock.add(new stock("l2", "CABIDE", 1, 1));

       // create a new list
        List<stock> allStockNew = new ArrayList<>();

        // now yo have to add your logic of adding multiple stock in this. you can use while or any condition as per your need

    // iterate through new list. if element present, add new value in this. else enter new entry.
        for(int i = 0 ; i < allStockNew.size() ; i++) {

            if (allStockNew.get(i).s2.euqals( "CAIXA") && allStockNew.get(i).s1.euqals( "l1")) {// your new stock name
                stock s = allStockNew.get(i);
                s.a1+=5;//new value
                s.a2+=5; // new value
                allStockNew.add(s);
            }
            else {
                allStockNew.add(new stock("l1", "CABIDE", 1, 0));
            }
        }

    }

}
票数 0
EN

Stack Overflow用户

发布于 2019-09-04 06:15:08

最简单的方法是:

代码语言:javascript
代码运行次数:0
运行
复制
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Jack <jackkobec>
 */
public class Test {
    public static void main(String[] args) {

        List<Stock> allStock = new ArrayList<>();
        List<Stock> result = new ArrayList<>();

        allStock.add(new Stock("l1", "CAIXA", 1, 4));
        allStock.add(new Stock("l1", "CABIDE", 1, 0));
        allStock.add(new Stock("l1", "CAIXA", 5, 5));
        allStock.add(new Stock("l1", "CABIDE", 1, 0));

        allStock.add(new Stock("l2", "CAIXA", 1, 4));
        allStock.add(new Stock("l2", "CABIDE", 1, 0));
        allStock.add(new Stock("l2", "CAIXA", 5, 5));
        allStock.add(new Stock("l2", "CABIDE", 1, 1));

        allStock.stream().map(stock -> stock.productType).distinct()
                .forEach(distinctProductType -> {
                    allStock.stream().filter(stock -> stock.productType.equals(distinctProductType))
                            .reduce((stock1, stock2) -> {
                                if (stock1.store.equals(stock2.store)) {
                                    result.add(
                                            new Stock(
                                                    stock1.store,
                                                    stock1.productType,
                                                    stock1.amount_1 + stock2.amount_1,
                                                    stock1.amount_ + stock2.amount_));
                                }

                                return stock2;
                    });

                });

        result.forEach(stock -> System.out.println(
                "store: " + stock.store + "\n"
                + "productType: " + stock.productType + "\n"
                + "amount_1: " + stock.amount_1 + "\n"
                + "amount_: " + stock.amount_ + "\n"
        ));
    }
}

class Stock {
    public String store;
    public String productType;
    public Integer amount_1;
    public Integer amount_;

    public Stock() {
    }

    public Stock(String store, String productType, Integer amount_1, Integer amount_) {
        this.store = store;
        this.productType = productType;
        this.amount_1 = amount_1;
        this.amount_ = amount_;
    }

    @Override
    public String toString() {
        return "Stock{" +
                "store='" + store + '\'' +
                ", productType='" + productType + '\'' +
                ", amount_1=" + amount_1 +
                ", amount_=" + amount_ +
                '}';
    }
}

输出:

商店: l1 productType: CAIXA amount_1: 6 amount_:9

商店: l2 productType: CAIXA amount_1: 6 amount_:9

存储: l1 productType: CABIDE amount_1: 2 amount_:0

存储: l2 productType: CABIDE amount_1: 2 amount_:1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57779002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档