gpt4 book ai didi

java - 不同的嵌套列表,按值属性比较列表项,Java8 Lambda

转载 作者:行者123 更新时间:2023-12-02 00:01:32 26 4
gpt4 key购买 nike

我有带有自定义对象的嵌套列表,即:Person类

现在,我想按值比较项目,例如建议代码。

现在,我已经嵌套了List,但是我需要在容器List中生成Distinct List。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.IntStream;


public class DistinctNestedListComparingByValueProperties {

public static void main(String[] args) {

List<Person> listA = Arrays.asList(new Person("a", 0), new Person("b", 1));
List<Person> listB = Arrays.asList(new Person("a", 0), new Person("b", 1));
boolean areEqual = equalListsByItemValues(listA, listB);
if (areEqual) {
System.out.println("Compared Lists Are Equal");
} else {
System.out.println("Compared Lists Are Different");
}

List<List<Person>> nestedPersonList = Arrays.asList(
Arrays.asList(new Person("a", 0), new Person("b", 1)), //0
Arrays.asList(new Person("a", 0), new Person("b", 1)), //1
Arrays.asList(new Person("a", 0), new Person("b", 1)), //2
Arrays.asList(new Person("a", 0), new Person("b", 1), new Person("c", 2)), //3
Arrays.asList(new Person("a", 0), new Person("b", 1), new Person("c", 2)), //4
Arrays.asList(new Person("a", 0)) // 5
);


nestedPersonList.forEach(System.out::println);
System.out.println("\n");

Set<List<Person>> distinctPersonLists = new HashSet<>(nestedPersonList);

List<List<Person>> distinctNestedList = getDistinctItemsList(nestedPersonList);
distinctNestedList.forEach(System.out::println);
}

public static List<List<Person>> getDistinctItemsList(List<List<Person>> nestedList) {
List<List<Person>> distinctNestedList = new ArrayList<>();
nestedList.forEach(personList -> {
boolean isNotFound = distinctNestedList
.stream()
.filter(addedPersonList -> equalListsByItemValues(addedPersonList, personList))
.count() == 0L;
if (isNotFound) {
distinctNestedList.add(personList);
}
});
return distinctNestedList;
}


public static boolean equalListsByItemValues(List<?> listA, List<?> listB) {
if (listA == null || listB == null) {
return false;
}
if (listA.size() != listB.size()) {
return false;
}
return IntStream.range(0, listA.size())
//Comparing By Value Properties (toString() based on)
.filter(idx -> !String.valueOf(listA.get(idx)).equals(String.valueOf(listB.get(idx))))
.count() == 0L;
}

public static class Person {

private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if (this.age != other.age) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
return true;
}

@Override
public String toString() {
return "Person{" + "name=" + name + ", age=" + age + '}';
}

}
}


尽管我的代码有效,但我想知道。

如何使用Lambda Java 8优化我的代码的正确方式?
1.比较每个项目的属性
2.实现嵌套列表的唯一性

是否可以实现 getDistinctItemsList方法的通用(嵌套列表)?

最佳答案

谢谢,收集您的意见并修复equalshashcode方法。

我的代码正常工作。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;

public class DistinctNestedListComparingByValueProperties {

public static void main(String[] args) {

List<Person> listA = Arrays.asList(new Person("a", 0), new Person("b", 1));
List<Person> listB = Arrays.asList(new Person("a", 0), new Person("b", 1));
boolean areEqual = listA.equals(listB);
if (areEqual) {
System.out.println("Compared Lists Are Equal");
} else {
System.out.println("Compared Lists Are Different");
}

List<List<Person>> nestedPersonList = Arrays.asList(
Arrays.asList(new Person("a", 0), new Person("b", 1)), //0
Arrays.asList(new Person("a", 0), new Person("b", 1)), //1
Arrays.asList(new Person("a", 0), new Person("b", 1)), //2
Arrays.asList(new Person("a", 0), new Person("b", 1), new Person("c", 2)), //3
Arrays.asList(new Person("a", 0), new Person("b", 1), new Person("c", 2)), //4
Arrays.asList(new Person("a", 0)) // 5
);


nestedPersonList.forEach(System.out::println);
System.out.println("\n");

List<List<Person>> list = new ArrayList<>(new HashSet<>(nestedPersonList));
list.stream().forEach(System.out::println);

}

public static class Person {

private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public int hashCode() {
int hash = 5;
hash = 73 * hash + Objects.hashCode(this.name);
hash = 73 * hash + this.age;
return hash;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if (this.age != other.age) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
return true;
}

@Override
public String toString() {
return "Person{" + "name=" + name + ", age=" + age + '}';
}

}

}

关于java - 不同的嵌套列表,按值属性比较列表项,Java8 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58175843/

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