3
votes

Liste de filtrage quelle propriété n'est pas incluse dans la propriété d'une autre liste

newListBill.add(new Bill(1L)); 
newListBill.add(new Bill(3L));
newListBill.add(new Bill(5L));

2 commentaires

Veuillez corriger void BillId et List listDetail .


@tsolakp merci de le faire!


5 Réponses :


2
votes

Utilisation de l'API de flux:

listBill.stream()
.filter( b -> !listDetail.stream()
     .anyMatch( d -> d.getBillId().getCode() == b.getCode() ) )
.collect( Collectors.toList() );


2 commentaires

Désolé. J'ai utilisé votre ancien exemple de code. Voir la réponse mise à jour.


vous pouvez utiliser noneMatch au lieu de ! anyMatch



-1
votes

Vous pouvez simplement parcourir les deux listes et comparer la variable de code (si je comprends bien, c'est le seul critère que vous souhaitez comparer?):

    ArrayList<Bill> result = new ArrayList<>();
    for(Bill bill: listBill) {
       for(Detail detail : listDetail) {
          if(bill.getCode() == detail.getBillId().getCode() {
                result.add(bill);
        }
      }
}


1 commentaires

la condition est, si non trouvée!



1
votes

Utilisation de Stream, Java 8

    List<Bill> substractListBill = listBill.stream().filter(bill -> !listDetail.stream()
            .map(Detail::getBillId)
            .map(BillId::getCode)
            .anyMatch(code ->  Objects.equals(code, bill.getCode())))
            .collect(Collectors.toList());
    System.out.println(substractListBill);


0 commentaires

2
votes

Il existe une solution plus optimale avec une complexité O (nlogn). Premièrement, obtenez la liste des codes à partir des détails:

List<Bill> collect = listBill.stream()
            .filter(bill -> Collections.binarySearch(codes, bill.getCode()) < 0)
            .collect(Collectors.toList());

System.out.println(collect);      // [Bill{code=1}, Bill{code=3}, Bill{code=5}]

Et maintenant, faites le filtre avec la recherche binaire (les codes ont déjà été triés):

List<Long> codes = listDetail.stream()
            .map(detail -> detail.getBillId().getCode())
            .sorted()
            .collect(Collectors.toList());


0 commentaires

0
votes

Juste une autre variante de la réponse existante avec l'utilisation de noneMatch pour éviter la négation explicite:

List<Bill>  output = listBill.stream()
        .filter( b -> listDetail.stream()
              .noneMatch(d -> d.getBillId().getCode().equals(b.getCode()))) // change here
        .collect(toList());


1 commentaires