Java ArrayList中类对象属性的和值

Java ArrayList中类对象属性的和值,java,arrays,object,collections,contains,Java,Arrays,Object,Collections,Contains,我有一个ArrayList,它有许多对象。我想对相同属性名的值求和 数组列表中的示例数据是ProfitAndLossDataDO的对象 "Michel" , 5000 "Alex" , 5000 "Edvin" , 4000 "Sosha" , 3000 "Michel" , 2000 "Alex" , 3000 public class ProfitAndLossDataDO { String ledgerName;

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

数组列表
中的示例数据是ProfitAndLossDataDO的对象

      "Michel" , 5000
      "Alex" , 5000
      "Edvin" , 4000
      "Sosha" , 3000
      "Michel" , 2000
      "Alex" , 3000
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());
}
}
结果将是(当人相同时的值之和)——

逻辑类ProfitAndLossDataDO

      "Michel" , 5000
      "Alex" , 5000
      "Edvin" , 4000
      "Sosha" , 3000
      "Michel" , 2000
      "Alex" , 3000
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());
}
}

谢谢

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

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

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

例如:

HashMap<String, LinkedList<Double>> cache = new HashMap<String, LinkedList<Double>>();
HashMap缓存=新建HashMap();

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

为什么不将它们放在基于映射的集合中,并使用键/值对

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

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

例如:

HashMap<String, LinkedList<Double>> cache = new HashMap<String, LinkedList<Double>>();
HashMap缓存=新建HashMap();

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

我将迭代列表并在映射中收集结果:

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());
}

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

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());
}

您可以按照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);
    }

}
}
公共类ProfitAndLossDataDO{
HashMap数据=新的HashMap();
公共利益{
}
public void updateLedger(String-ledgerName,double-ledgerAmount){
双温;
if(数据容器(账本名称)){
temp=数据获取(账本名称)+账本计数;
数据输入(账本名称、温度);
}
否则{
data.put(ledgerName、ledgerAmount);
}
}
}

您可以按照建议使用哈希映射。使用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);
    }

}
}
公共类ProfitAndLossDataDO{
HashMap数据=新的HashMap();
公共利益{
}
public void updateLedger(String-ledgerName,double-ledgerAmount){
双温;
if(数据容器(账本名称)){
temp=数据获取(账本名称)+账本计数;
数据输入(账本名称、温度);
}
否则{
data.put(ledgerName、ledgerAmount);
}
}
}

@Eran无法找到sum@Eran如果使用基于哈希的方法,则无法找到sumokey,因为它只插入uniue值。但是我怎样才能得到这些价值呢。显示一些小示例看看更新后的答案,如果我使用基于哈希的it only insert uniue值,您可以在其中找到更详细的解释键。但是我怎样才能得到这些价值呢。展示一些小例子看看更新后的答案,在那里你可以找到更详细的解释如果你想保持插入顺序,请使用LinkedHashMap。如果你想保持插入顺序,请使用LinkedHashMap。