如何使用Java

时间:2018-08-30 11:39:58

标签: java

我在列表中有带有P1{Salary,Tax,'C or D'}的Persons对象。想做以下两件事 1.将所有Person对象隔离为一个person对象(现有Person对象中的任何一个),其中此person对象的薪水将为所有其“ CreditOrDebit”标志为“ C”的对象薪水之和。并将其添加到ArrayList中。 2.想将所有带有“ CreditOrDebit”标志为“ D”的剩余Person对象添加到数组列表(我曾在第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")

我需要的是比这更有效的代码。作为这段代码,我在项目中的很多地方都使用了

谢谢!

2 个答案:

答案 0 :(得分:2)

对于可以为每种类型的交易求和的解决方案,可以使用Collectors.groupingBy。这就像一个SQL group by。您可以为所需分组指定“键”和功能。接下来,我将按type分组并求和salary

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

答案 1 :(得分:0)

您可以做到Java 8的功能风格:

int sumOfC
= persons.stream()
.filter(person -> person.getCreditOrDebit().equals("C"))
.mapToInt(person -> person.getSalary()).sum();

然后

Person p = new Person(sumOfC, tax, "C");

同样,您可以为D

Java 7样式:

int sumOfC = 0;
for (Person person : persons) {
    if (person.getCreditOrDebit().equals("C")){
        sum += person.getSalary();
    }
}
Person p = new Person(sumOfC, tax, "C");