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

时间:2019-09-30 22:06:51

标签: java generics java-8 distinct nested-lists

我有带有自定义对象的嵌套列表,即: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方法的通用(嵌套列表)?

1 个答案:

答案 0 :(得分:0)

谢谢,收集您的评论,并修复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 + '}';
        }

    }

}