Java 合并列表或在列表中附加具有唯一值的字段

Java 合并列表或在列表中附加具有唯一值的字段,java,arraylist,java-8,java-stream,array-merge,Java,Arraylist,Java 8,Java Stream,Array Merge,我必须以这样一种方式合并这两个列表,以使最终结果如下 List A = [ MyClass(country=BE, userNumber=[12345], cityName = Brussels ), (country= BE , userNumber=[12345], cityName = Bruges ), (country= DE , userNumber=[54645], cityName =

我必须以这样一种方式合并这两个列表,以使最终结果如下

List A = [
           MyClass(country=BE, userNumber=[12345], cityName = Brussels ),
                  (country= BE , userNumber=[12345], cityName = Bruges ),
                  (country= DE , userNumber=[54645], cityName = Frankfurt )
         ]


List B = [
          MyClass(country=BE, userNumber=[34356], cityName = Brussels ),
                 (country= BE , userNumber=[64325], cityName = Namur )
         ]
尝试过的解决方案:

  • 获取列表的cityName和listA是否包含listB如果为true,则在listB上运行for循环,找到相同的cityName并尝试将用户号附加到listA
上述解决方案起了一半作用,但不确定其效率如何。请帮助。

List first=new ArrayList();
   Expected Final List = [
                        MyClass(country=BE, userNumber=[12345,34356], cityName = Brussels ),
                             (country= BE , userNumber=[12345], cityName = Bruges ),
                             (country= DE , userNumber=[54645], cityName = Frankfurt ),
                             (country= BE , userNumber=[64325], cityName = Namur )
            ]
第二个列表=新的ArrayList(); 收件人(地址:第一){ int index=second.indexOf(地址); 如果(索引>=0){ first.getUserNumber().addAll(second.get(index.getUserNumber()) } }
不要忘记重写equals方法并忽略equals方法中的userNumber字段。

List first=new ArrayList();
第二个列表=新的ArrayList();
收件人(地址:第一){
int index=second.indexOf(地址);
如果(索引>=0){
first.getUserNumber().addAll(second.get(index.getUserNumber())
}
}

不要忘记覆盖equals方法并忽略equals方法中的userNumber字段。

您需要使用字段
country
cityName
覆盖POJO类中的
equals()
hashcode()
方法。 然后

  • 将所有元素添加到名为
    finalList
    的列表中

  • 迭代
    finalList
    中的每个元素,并将新元素添加到
    map

  • 如果在地图中发现重复元素,则将地图中对象的
    userNumber
    与重复对象的合并。并添加回地图

  • 重复步骤2和3,直到迭代完成

  • map的
    键转换为
    finalList

  • 例如:

        List<Address> first = new ArrayList<>();
        List<Address> second = new ArrayList<>();
        for (Address address : first) {
            int index = second.indexOf(address);
            if(index >= 0){
               first.getUserNumber().addAll(second.get(index).getUserNumber())
            }
        }
    
    import java.util.*;
    导入java.util.stream.IntStream;
    类MyClass{
    私人国家;
    私有int[]用户号;
    私有字符串cityName;
    MyClass(字符串country,int[]userNumber,字符串cityName){
    这个国家=国家;
    this.userNumber=userNumber;
    this.cityName=cityName;
    }
    公共字符串getCountry(){
    返回国;
    }
    公共国家/地区(字符串国家/地区){
    这个国家=国家;
    }
    public int[]getUserNumber(){
    返回用户号;
    }
    public void setUserNumber(int[]userNumber){
    this.userNumber=userNumber;
    }
    公共字符串getCityName(){
    返回城市名称;
    }
    公共void setCityName(字符串cityName){
    this.cityName=cityName;
    }
    @凌驾
    公共布尔等于(对象o){
    如果(this==o)返回true;
    如果(o==null | | getClass()!=o.getClass())返回false;
    MyClass MyClass=(MyClass)o;
    返回country.equals(myClass.country)&&
    等于(myClass.cityName);
    }
    @凌驾
    公共int hashCode(){
    返回Objects.hash(country,cityName);
    }
    }
    公开课考试{
    公共静态void main(字符串参数[]){
    List listA=new ArrayList();
    List finalList=new ArrayList();
    添加(新的MyClass(“BE”,新的int[]{12345},布鲁塞尔”);
    add(newmyclass(“BE”,newint[]{12345},“Bruges”);
    添加(新的MyClass(“DE”,新的int[]{54645},“Frankfurt”);
    List listB=新的ArrayList();
    添加(新的MyClass(“BE”,新的int[]{34356},布鲁塞尔”);
    添加(新的MyClass(“BE”,新的int[]{64325},“Namur”);
    finalList.addAll(listA);
    finalList.addAll(列表b);
    HashMap=newHashMap();
    for(MyClass MyClass:finalList){
    MyClass objInMap=map.get(MyClass);
    if(objInMap!=null){
    int[]userNum=IntStream.concat(Arrays.stream(objInMap.getUserNumber()),
    Arrays.stream(myClass.getUserNumber())
    .distinct()
    .toArray();
    setUserNumber(userNum);
    }否则{
    map.put(myClass,myClass);
    }
    }
    finalList=newarraylist(map.keySet());
    System.out.println(finalList);
    }
    }
    
    您需要在POJO类中用字段
    country
    cityName
    覆盖
    equals()
    hashcode()
    方法。 然后

  • 将所有元素添加到名为
    finalList
    的列表中

  • 迭代
    finalList
    中的每个元素,并将新元素添加到
    map

  • 如果在地图中发现重复元素,则将地图中对象的
    userNumber
    与重复对象的合并。并添加回地图

  • 重复步骤2和3,直到迭代完成

  • map的
    键转换为
    finalList

  • 例如:

        List<Address> first = new ArrayList<>();
        List<Address> second = new ArrayList<>();
        for (Address address : first) {
            int index = second.indexOf(address);
            if(index >= 0){
               first.getUserNumber().addAll(second.get(index).getUserNumber())
            }
        }
    
    import java.util.*;
    导入java.util.stream.IntStream;
    类MyClass{
    私人国家;
    私有int[]用户号;
    私有字符串cityName;
    MyClass(字符串country,int[]userNumber,字符串cityName){
    这个国家=国家;
    this.userNumber=userNumber;
    this.cityName=cityName;
    }
    公共字符串getCountry(){
    返回国;
    }
    公共国家/地区(字符串国家/地区){
    这个国家=国家;
    }
    public int[]getUserNumber(){
    返回用户号;
    }
    public void setUserNumber(int[]userNumber){
    this.userNumber=userNumber;
    }
    公共字符串getCityName(){
    返回城市名称;
    }
    公共void setCityName(字符串cityName){
    this.cityName=cityName;
    }
    @凌驾
    公共布尔等于(对象o){
    如果(this==o)返回true;
    如果(o==null | | getClass()!=o.getClass())返回false;
    MyClass MyClass=(MyClass)o;
    返回国家/地区。等于(myClass.country
    
        public static <T> T[] concatAll(T[] first, T[]... rest) {
            int totalLength = first.length;
            for (T[] array : rest) {
                totalLength += array.length;
            }
            T[] result = Arrays.copyOf(first, totalLength);
            int offset = first.length;
            for (T[] array : rest) {
                System.arraycopy(array, 0, result, offset, array.length);
                offset += array.length;
            }
            return result;
        }
    
        public static void main(String[] args) {
            List<MyClass> listA = new ArrayList();
            List<MyClass> finalList = new ArrayList();
            listA.add(new MyClass("BE", new Integer[]{12345}, "Brussels"));
            listA.add(new MyClass("BE", new Integer[]{12345}, "Bruges"));
            listA.add(new MyClass("DE", new Integer[]{54645}, "Frankfurt"));
            List<MyClass> listB = new ArrayList();
            listB.add(new MyClass("BE", new Integer[]{34356}, "Brussels"));
            listB.add(new MyClass("BE", new Integer[]{64325}, "Namur"));
            finalList.addAll(listA);
            finalList.addAll(listB);
            List<MyClass> merged = new ArrayList<>();
            finalList.parallelStream().collect(Collectors.groupingBy(cl -> (cl.getCountry() + cl.getCityName()), Collectors.toList()))
                    .forEach((name, item) -> {
                        item.stream().reduce((a, b) -> new MyClass(a.getCountry(), concatAll(a.getUserNumber(), b.getUserNumber()), a.getCityName())).ifPresent(merged::add);
    
                    });
            System.out.println(merged);
        }
    }
    
    class MyClass {
        private String country;
        private Integer[] userNumber;
        private String cityName;
    
        MyClass(String country, Integer[] userNumber, String cityName) {
            this.country = country;
            this.userNumber = userNumber;
            this.cityName = cityName;
        }
    
        public String getCountry() {
            return country;
        }
    
        public void setCountry(String country) {
            this.country = country;
        }
    
        public Integer[] getUserNumber() {
            return userNumber;
        }
    
        public void setUserNumber(Integer[] userNumber) {
            this.userNumber = userNumber;
        }
    
        public String getCityName() {
            return cityName;
        }
    
        public void setCityName(String cityName) {
            this.cityName = cityName;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            MyClass myClass = (MyClass) o;
            return country.equals(myClass.country) &&
                    cityName.equals(myClass.cityName);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(country, cityName);
        }
    Maybe, It is a great way.