java8写一个当List<A>与List<B>中多个字段一致的数据之比为N:M时,将匹配一致的List<A>与List<B>分别出力
时间: 2024-05-09 08:21:01 浏览: 121
java计算同一个list中是否有相同的值
5星 · 资源好评率100%
假设A和B类都有两个字段id和name,且id和name都是String类型。要找出List<A>和List<B>中id和name都相同的数据,并且这些数据在两个列表中的比例为N:M。
可以使用Java 8中的Stream API来实现:
```
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<A> listA = Arrays.asList(
new A("1", "John"),
new A("2", "Mary"),
new A("3", "Tom"),
new A("4", "Lily"),
new A("5", "Bob")
);
List<B> listB = Arrays.asList(
new B("1", "John"),
new B("2", "Mary"),
new B("4", "Lily"),
new B("6", "Peter"),
new B("7", "Alice"),
new B("8", "Bob")
);
int n = 3;
int m = 2;
Map<String, List<A>> mapA = listA.stream()
.collect(Collectors.groupingBy(a -> a.getId() + "-" + a.getName()));
Map<String, List<B>> mapB = listB.stream()
.collect(Collectors.groupingBy(b -> b.getId() + "-" + b.getName()));
List<A> resultA = new ArrayList<>();
List<B> resultB = new ArrayList<>();
mapA.forEach((key, valueA) -> {
List<B> valueB = mapB.get(key);
if (valueB != null && valueB.size() == n * valueA.size() / m) {
resultA.addAll(valueA);
resultB.addAll(valueB);
}
});
System.out.println("List<A>:");
resultA.forEach(System.out::println);
System.out.println("List<B>:");
resultB.forEach(System.out::println);
}
}
class A {
private String id;
private String name;
public A(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "A{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
class B {
private String id;
private String name;
public B(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "B{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
```
在这个例子中,先将List<A>和List<B>中的数据按照id和name合并成一个字符串作为Map的key,然后将List<A>和List<B>分别存储在两个Map中。接着遍历MapA,找到与之对应的MapB,如果MapB存在并且MapB中的数据数量符合比例N:M,则将这些数据加入到结果列表中。最后输出结果列表即可。
阅读全文