使用单个匹配字段删除java流中的特定重复项

使用单个匹配字段删除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; } 我有一张这

给定一个包含以下字段的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; 
}
我有一张这样的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);