gpt4 book ai didi

java - 如何使用java分隔数组列表中的对象

转载 作者:行者123 更新时间:2023-12-02 01:57:44 25 4
gpt4 key购买 nike

我有 Persons 对象 P1{Salary,Tax,'C or D'}在列表中。想做以下两件事1. 将所有 Person 对象分离为一个 Person 对象(现有 Person 对象中的任何一个),其中该 Person 对象的工资将是“CreditOrDebit”标志为“C”的所有 Person 对象的工资之和。并想将其添加到 ArrayList 中。2.想要将所有剩余的“CreditOrDebit”标志为“D”的人员对象添加到数组列表(我在第 1 点中添加过)

示例如下:

Class Person{
int sal,tax;
String CreditOrDebit;
//with setters and getters
}

例如:输入:

Person1(1000, 10,"C");
Person2(4000, 15,"D");
Person3(6000, 15,"D");
Person4(8000, 10,"C");
Person5(5000, 10,"C");

输出:

New Person1(4000, 15, "D")
New Person2(6000, 15, "D")
New Person3(14000, 10, "C")

我需要的是比这更高效的代码。正如我在项目中的很多地方使用的这段代码。

提前致谢!

最佳答案

对于可以对每种类型的交易进行求和的解决方案,您可以使用Collectors.groupingBy。这就像 SQL 分组依据一样工作。您指定“键”和所需分组的功能。接下来,我将按类型进行分组并对薪水求和:

List<Person> persons = new ArrayList<>();
persons.add(new Person(1000, "C"));
persons.add(new Person(500, "D"));
persons.add(new Person(100, "C"));
persons.add(new Person(1500, "C"));
persons.add(new Person(750, "D"));

Map<String, Integer> result = persons.stream().collect(
Collectors.groupingBy(Person::getType, //group by type
Collectors.summingInt(Person::getSalary))); //sum salary

System.out.println(result);

{C=2600, D=1250}

关于创建新的Person的部分很简单。只需要迭代 Map 并构建一个新实例:

List<Person> summary = result.entrySet().stream()
.map(e -> new Person(e.getValue(), e.getKey()))
.collect(Collectors.toList());
System.out.println(summary);

请注意,这不是 Person 中应包含的信息。实例名称在这里没有意义...您应该更正它。

这使用了以下类描述:

class Person {
int salary;
String type;

public Person(int salary, String type) {
super();
this.salary = salary;
this.type = type;
}

public int getSalary() {
return salary;
}

public String getType() {
return type;
}
}

关于java - 如何使用java分隔数组列表中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096158/

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