我有带有自定义对象的嵌套列表,即: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
方法的通用(嵌套列表)?
答案 0 :(得分:0)
谢谢,收集您的评论,并修复equals
和hashcode
方法。
我正在执行代码。
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 + '}';
}
}
}