gpt4 book ai didi

Java对象列表: Aggregation

转载 作者:行者123 更新时间:2023-12-01 08:01:09 29 4
gpt4 key购买 nike

我有一个例子,我需要聚合 Beans/Objects 列表以显示它们的总体特征。让我先解释一下我的要求。我有一个人员详细信息的列表,如下所示:

    Person  Bank  Balance
---------------------
Sam GS 200
Sam JP 200
Sam WF 200
John GS 200
John JP 200
Robin JP 200
Robin JP 200

我想汇总每个人的余额。

    Sam           700   <---- Key
------------------
Sam GS 200
Sam JP 300
Sam WF 200

John 500 <---- Key
------------------
John GS 300
John JP 200

Robin 200 <---- Key
------------------
Robin JP 100
Robin JP 100

现在,让我们切换到代码中的内容 - 此类对象的 List,我需要将它们放入 Map 中。键是聚合的详细信息,其值是详细信息列表。这是我的尝试,尽管不是那么好:

public Map<Bean, List<Bean>> getAggregation(List<Bean> beans)
{
Map<Bean, ArrayList<Bean>> aggreagtedBeans = new HashMap<Bean, new ArrayList<Bean>>();

for(Bean bean : beans)
{
String name = bean.getName();
boolean presentALready = false;
Bean correspondingKey = null;
for(Bean key :aggreagtedBeans.keySet())
{
if(key.getName().equals(name))
{
presentALready = true;
correspondingKey = key;
}
}

if(presentALready)
{
aggreagtedBeans.put(correspondingKey, aggreagtedBeans.get(correspondingKey).add(bean));
}

else
{
aggreagtedBeans.put(bean, aggreagtedBeans.get(correspondingKey).add(bean));
}

}
return aggreagtedBeans;
}

问题:

即使使用这种 Map 方法, key 也会被修复,因此当为特定人员添加每一行时,我无法更新余额。

限制:

我知道这种类型的用例非常适合数据库 order by 子句,但我无法使用它们。这些是 Java 对象

此外,如果您认为我应该根据我的用例使用不同的数据结构,请提出建议,如果可能,请提供代码片段。

编辑:

附上Bean类代码以供引用:

public class Bean 
{
String name;
String bank;
int balance;

// constructors and getters
}

最佳答案

无法自拔,因为 Java 8 太棒了:

public static void main(String [] args) {
List<Bean> list = new ArrayList<>();
list.add(new Bean("John", 10));
list.add(new Bean("Sam", 666));
list.add(new Bean("Sam", 9));
list.add(new Bean("John", 1));
list.add(new Bean("John", 7));

Map<String, Integer> sum = list.stream().collect(Collectors.groupingBy(Bean::getName, Collectors.summingInt(Bean::getBalance)));
sum.entrySet().forEach(x -> list.add(new Bean(x.getKey(),x.getValue(), true)));
list.sort((x,y) -> {
int nameComp = x.getName().compareTo(y.getName());
if (nameComp == 0)
return x.isSum() ? -1 : 1;
return nameComp;
});
list.forEach(System.out::println);
}

// Bean class with no "bank" variable, but with a new constructor and overloaded .toString()
static class Bean {
private String name;
private int balance;
private final boolean isSum;

Bean(String name, int balance, boolean isSum) {
this.isSum = isSum;
this.name = name;
this.balance = balance;
}

Bean(String name, int balance) {
this.isSum = false;
this.name = name;
this.balance = balance;
}

public String getName() { return name; }
public int getBalance() { return balance; }
public boolean isSum() { return isSum; }
@Override
public String toString() { return name + " | " + balance + (isSum() ? " *Sum*" : ""); }
}

输出:

John | 18 Sum

John | 10

John | 1

John | 7

Sam | 675 Sum

Sam | 666

Sam | 9

关于Java对象列表: Aggregation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226144/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com