Java ArrayList中类对象属性的和值
我有一个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;
数组列表
中的示例数据是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。