有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ArrayList中类对象属性的java求和值

我有一个ArrayList,它有许多对象。我想对相同属性名的值求和

示例Array List中的数据是ProfitAndLossDataDO的对象

      "Michel" , 5000
      "Alex" , 5000
      "Edvin" , 4000
      "Sosha" , 3000
      "Michel" , 2000
      "Alex" , 3000

结果将是(当人相同时的值之和)——

      "Michel" ,7000
      "Alex" ,  8000
      "Edvin" , 4000
      "Sosha" , 3000

逻辑类ProfitAndLossDataDO

public class ProfitAndLossDataDO {

String ledgerName;
double ledgerAmount;

public ProfitAndLossDataDO() {
}

public ProfitAndLossDataDO(String ledgerName, double ledgerAmount) {
    this.ledgerName = ledgerName;
    this.ledgerAmount = ledgerAmount;
}



public String getLedgerName() {
    return ledgerName;
}

public void setLedgerName(String ledgerName) {
    this.ledgerName = ledgerName;
}

public double getLedgerAmount() {
    return ledgerAmount;
}

public void setLedgerAmount(double ledgerAmount) {
    this.ledgerAmount = ledgerAmount;
}


@Override
public String toString()
{
            return ("ledger name : "+this.getLedgerName()+" Amount : "+this.getLedgerAmount());
}
}

谢谢


共 (3) 个答案

  1. # 1 楼答案

    您可以按照aleroot的建议使用哈希映射。使用name作为键,sum作为值。每当需要插入值时,只需检查具有相同键的条目是否存在并更新它

    public class ProfitAndLossDataDO {
    
    HashMap<String, Double> data = new HashMap<String, Double>();
    
    public ProfitAndLossDataDO() {
    
    }
    
    public void updateLedger(String ledgerName, double ledgerAmount) {
        double temp;
        if(data.containsKey(ledgerName)) {
            temp = data.get(ledgerName)+ledgerAmount;
            data.put(ledgerName,temp);
        }
        else {
            data.put(ledgerName,ledgerAmount);
        }
    
    }
    }
    
  2. # 2 楼答案

    为什么不把它们放在一个基于地图的集合中,并带有键/值对

    我认为在这种情况下,基于地图的集合更适合您拥有的数据和您想要使用它的上下文

    如果需要保留列表中的单个项目,可以使用链接列表作为映射的值

    例如:

    HashMap<String, LinkedList<Double>> cache = new HashMap<String, LinkedList<Double>>();
    

    并对值LinkedList的每个元素求和,以找到总数。。。您甚至可以使用getTotal()或Sum()等辅助函数将双精度链接列表包装到容器对象中

  3. # 3 楼答案

    我将迭代列表并在地图中收集结果:

    public static List<ProfitAndLossDataDO> sumPerLedgerName
        (List<ProfitAndLossDataDO> list) {
    
        Map<String, ProfitAndLossDataDO> map = new HashMap<>();
    
        for (ProfitAndLossDataDO p : list) {
            String name = p.getLedgerName();
            ProfitAndLossDataDO sum = map.get(name);
            if (sum == null) {
                sum = new ProfitAndLossDataDO(name, 0.0);
                map.put(name, sum);
            }
            sum.setLedgerAmount(sum.getLedgerAmount() + p.getLedgerAmount());
        }
        return new ArrayList<>(map.values());
    }
    

    编辑:

    Java 8对^{}接口的增强使我们能够以稍微优雅的方式实现此方法,中间是恼人的if块:

    public static List<ProfitAndLossDataDO> sumPerLedgerName
        (List<ProfitAndLossDataDO> list) {
    
        Map<String, ProfitAndLossDataDO> map = new HashMap<>();
    
        for (ProfitAndLossDataDO p : list) {
            String name = p.getLedgerName();
            ProfitAndLossDataDO sum = map.computeIfAbsent(name, n -> new ProfitAndLossDataDO(n, 0.0));
            sum.setLedgerAmount(sum.getLedgerAmount() + p.getLedgerAmount());
        }
        return new ArrayList<>(map.values());
    }