使用单个匹配字段删除java流中的特定重复项
给定一个包含以下字段的java pojo使用单个匹配字段删除java流中的特定重复项,java,Java,给定一个包含以下字段的java pojo public class Pojo { // for brevity I am excluding the property getters / setters etc. private int V; private BigDecimal Amount; private String Operation; private String Tag; private String Code; } 我有一张这
public class Pojo {
// for brevity I am excluding the property getters / setters etc.
private int V;
private BigDecimal Amount;
private String Operation;
private String Tag;
private String Code;
}
我有一张这样的POJO列表。
如果我特别比较Tag、Amount、Ver和ignore代码,我希望使用hash/stream/which删除所有行,其中对于相同的Tag、Amount和Ver,正好有1个IU和1个DU
是否有方法加入或分组流,以确保如果相同的值正好有1个insert update IU和1个delete update DU,那么这两个值都将被删除
Ver Amount Operation Tag Code
1 1 "IU" 6896450 5500
1 1 "DU" 6898103 5500
2 4 "IU" 6954561 5200
2 4 "DU" 6954561 5500
3 4 "IU" 7057717 5200
3 4 "DU" 7057717 5500
1 8 "IU" 7132952 5200
1 8 "DU" 7132952 5500
对于相同的值,您有2个IU和2个DU的id被删除了吗?或者,如果您有2个IU和1个DU,您是否为相同的值删除了一个IU?我将创建一个引用标记/代码/操作字段的PojoKey类,然后创建两个映射,将它们添加到其中,一个用于IU,一个用于DU。在此基础上,您可以使用一个结构良好的数据模型,在本例中,您可以比较两个映射以找到它们的并集。你需要决定如何处理每个项目都有多个IU/DU的情况。是的,谢谢,我很懒,这就是我所做的,谢谢你的提示。散列映射是一种方式,不幸的是,它的n^2否则。
// import static java.util.stream.Collectors.groupingBy;
List<Pojo> pojos = new ArrayList<>(Arrays.asList(
new Pojo(1, BigDecimal.ONE, "IU", "6896450", "5500"),
// ...,
new Pojo(1, BigDecimal.valueOf(8), "DU", "7132952", "5500")));
// Create a map (`opMapByTag`) by `Tag`,
// within the results/pojos create another map (`pojosByOp`) by `Operation`
Map<String, Map<String, List<Pojo>>> opMapByTag =
pojos.stream().collect(
groupingBy(Pojo::getTag,
groupingBy(Pojo::getOperation)));
Set<Pojo> toBeRemoved = new HashSet<>();
for (Entry<String, Map<String, List<Pojo>>> e : opMapByTag.entrySet())
{
Map<String, List<Pojo>> pojosByOp = e.getValue();
List<Pojo> l1, l2;
if ((pojosByOp.size() == 2) &&
((l1 = pojosByOp.get("IU")).size() == 1) &&
((l2 = pojosByOp.get("DU")).size() == 1))
{
Collections.addAll(toBeRemoved, l1.get(0), l2.get(0));
}
}
pojos.removeIf(toBeRemoved::contains);
pojos.forEach(System.out::println);