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
与重复对象的合并。并添加回地图
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
与重复对象的合并。并添加回地图
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.