java - 从另一个列表中查找列表中的(自定义)对象

标签 java arraylist filter java-8 java-stream

我有两个列表(火车、货车)。我只想拥有“wagon”列表中包含货车的火车并将它们存储在“finalList”中。

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

List<train> finalList

火车具有 ID、颜色、车厢属性。 货车具有 ID、座位、类型属性。 两个列表都有多个条目。

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()))))

但我无法从货车列表中按货车过滤火车列表

最佳答案

所以首先在描述中你这么说

A train has the attributes 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 的

@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() 对于这个方法也是必要的!

关于java - 从另一个列表中查找列表中的(自定义)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60479400/

相关文章:

r - 如何提取具有特定颜色的所有单元格值(及其单元格 ID)?

java - 使用自定义适配器获取已检查的项目

Java 7 -> Java 8 : AES Causes exception: "BadPaddingException: Given final block not properly padded" in conjunction with BufferedReader & ZipStreams

java - 在android中向arrayList添加值

java - 使用 contains(Object o) 比较两个不同的对象返回 false,当 equals(Object o) 返回 true

java - for 循环忽略了 ArrayList 数据集中的几个索引

python - 获取数据框中以数字开头的所有值

css - 为什么 webkit 过滤器悬停时堆叠顺序会发生变化?

java - WSDL2Java 不会创建所有 stub

java - Android ByteBuffer 到 float 转换返回错误值