如何解决使用唯一值合并列表或追加列表中的字段
Label
我必须以最终结果这样的方式合并这两个列表
struct
尝试的解决方案:
- 获取两个列表的 cityName 并且 listA 是否包含 listB 如果为 true 然后在 listB 上运行 for 循环并找到相同的 cityName 并尝试将 userNumber 附加到 listA。
上面的解决方案成功了一半,不确定它的效率如何。请帮忙。
解决方法
您需要使用字段 equals()
和 hashcode()
覆盖 POJO 类中的 country
和 cityName
方法。
那么
-
将所有元素添加到名为
finalList
的列表中。 -
迭代
finalList
中的每个元素并将新元素添加到map
中。 -
如果在地图中发现重复元素,则将地图中对象的
userNumber
与重复对象的元素合并。并添加回地图。 -
重复第 2 步和第 3 步,直到迭代完成。
-
将
map's
键转换为finalList
示例:
import java.util.*;
import java.util.stream.IntStream;
class MyClass{
private String country;
private int[] userNumber;
private String cityName ;
MyClass(String country,int[] 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 int[] getUserNumber() {
return userNumber;
}
public void setUserNumber(int[] 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);
}
}
public class Test {
public static void main(String args[]){
List<MyClass> listA = new ArrayList();
List<MyClass> finalList =new ArrayList();
listA.add(new MyClass("BE",new int[]{12345},"Brussels"));
listA.add(new MyClass("BE","Bruges"));
listA.add(new MyClass("DE",new int[]{54645},"Frankfurt"));
List<MyClass> listB = new ArrayList();
listB.add(new MyClass("BE",new int[]{34356},"Brussels"));
listB.add(new MyClass("BE",new int[]{64325},"Namur"));
finalList.addAll(listA);
finalList.addAll(listB);
HashMap<MyClass,MyClass> map = new HashMap<>();
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();
objInMap.setUserNumber(userNum);
}else{
map.put(myClass,myClass);
}
}
finalList = new ArrayList<>(map.keySet());
System.out.println(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())
}
}
不要忘记覆盖equals方法并忽略equals方法中的userNumber字段。
, 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,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},new Integer[]{54645},new Integer[]{34356},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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。