簡體   English   中英

從另一個列表中查找(自定義)列表中的對象

[英]Find (custom) objects in list from another list

我有兩個清單(火車,貨車)。 我只想擁有帶有“貨車”列表中貨車的火車,並將它們存儲在“finalList”中。

List<train> trains;
List<wagon> wagons;

List<train> finalList

火車具有屬性 Id、Color、Wagon。 貨車具有屬性 Id、Seats、Type。 兩個列表都有幾個條目。

List<train> finalList= trains.stream().filter(tr-> tr.getWagons.retainAll(wagons)).collect(Collectors.toList());

我的 finalList 每次都是空的,我不知道為什么。 與 containsAll() 相同。 我也嘗試過類似的事情:

finalList = trains.stream().filter(tr -> wagons.stream().anyMatch(wg -> tr.getWagons().foreach(trWg -> trWg.getId().equals(wg.getId()))))

但是我無法從貨車列表中按貨車過濾火車列表

我不知道你的 POJO 是什么,因為你沒有發布它們,所以我所能做的就是從你發布的屬性列表中假設。 這是一種方法。

我們所做的就是循環遍歷所有火車,並通過 Wagon 對象列表中是否包含與火車上的貨車具有相同 id 的貨車進行過濾。 然后我們收集到一個列表。

    List<Train> trains = Arrays.asList(
            new Train(1, 0, new Wagon(0, 1, 0)), 
            new Train(2, 0, new Wagon(1, 1, 0)));

    List<Wagon> wagons = Arrays.asList(new Wagon(0, 1, 0));

    List<Train> trainsFromWagons = trains.stream().filter(train -> wagons.stream().anyMatch(wagon -> train.wagon.id == wagon.id))
            .collect(Collectors.toList());

所以首先在描述中你說

火車具有屬性 Id, Color, Wagon

但是,稍后在示例中:

finalList = trains.stream() .filter(tr -> wagons.stream() .anyMatch(wg -> tr.getWagons() .foreach(trWg -> trWg.getId().equals(wg.getId()))));

因此,我假設第一個是正確的,出於某種原因,您的火車現在只能有一輛貨車

這個“問題”有幾種解決方案:

在我看來,第一個也是最干凈的方法:

List<Wagon> wagons = new ArrayList<>();

    wagons.add(new Wagon(0L, new ArrayList<>(), "0"));
    wagons.add(new Wagon(1L, new ArrayList<>(), "1"));

    List<Train> trains = new ArrayList<>();

    trains.add(new Train(0L, wagons.get(0), "Yellow"));
    trains.add(new Train(1L, wagons.get(1), "Blue"));
    trains.add(new Train(2L, new Wagon(12L, new ArrayList<>(), "not in wagon list"), "Blue"));


    List<Train> finalList = trains.stream().
            filter(train -> wagons.contains(train.getWagon()))
            .collect(Collectors.toList());

    finalList.forEach(System.out::println);

和 ofc POJO'S

@Getter
@AllArgsConstructor
@ToString
class Train {
    private Long id;
    private Wagon wagon;
    private String color;
}

@Getter
@ToString
@AllArgsConstructor
@EqualsAndHashCode
class Wagon {
    private Long id;
    private List<String> seats;
    private String type;
}

但是你必須記住在這里Wagon實現equals()

無需實現equals()第二種方法是:

  List<Train> finalList2 = trains.stream()
            .filter(train -> wagons
                    .stream()
                    .anyMatch(wagon -> wagon.getId().equals(train.getWagon().getId())))
            .collect(Collectors.toList());

現在假設你的火車可以有不止一輛貨車......

@Getter
@AllArgsConstructor
@ToString
class Train {
    private Long id;
    private List<Wagon> wagons;
    private String color;
}

和代碼:

List<Wagon> wagons = new ArrayList<>();

wagons.add(new Wagon(0L, new ArrayList<>(), "0"));
wagons.add(new Wagon(1L, new ArrayList<>(), "1"));
List<Wagon> wagons2 = new ArrayList<>();

wagons2.add(new Wagon(11L, new ArrayList<>(), "11"));
wagons2.add(new Wagon(12L, new ArrayList<>(), "12"));

List<Train> trains = new ArrayList<>();

trains.add(new Train(0L, wagons,"Yellow"));
trains.add(new Train(1L, wagons2, "Blue"));
trains.add(new Train(2L, Arrays.asList(new Wagon(132L, new ArrayList<>(),"not in wagon list")), "Blue"));

   List<Train> finalList3 = trains.stream()
            .filter(train -> train.getWagons().containsAll(wagons))
            .collect(Collectors.toList());

    finalList3.forEach(System.out::println);

只要您假設,您只對包含精確貨車集的火車感興趣。 這個方法也需要equals()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM