如何使用流API过滤连续元素?

我想知道是否有一种方法可以使用Java的流API过滤连续/互连的元素?

为您提供此问题的背景信息:我检索了包含不同站点的交通线列表。作为用户,我现在只想知道我从X到Y的路线上的旅行时间和车站。 因此,我需要以某种方式过滤互连的所有部分(停止a->停止b)。

我有一个未排序的对象列表,其中包含字段的开始和结束。我现在想检索一个列表,该列表仅包含在这两点之间逻辑连接的元素。 这里有个简单的例子:

我想过滤起点B和终点E

List to filter: {A,B},{B,C},{C,D},{D,E},{E,F}
List I want:    {B,C},{C,D},{D,E}
评论
  • oqui
    oqui 回复

    Here's one solution, based on the assumptions that there will be only one object with a given start, only one object with a given end and that there is a valid path between those:

    import java.util.Comparator;
    import java.util.List;
    
    public class FilterDemo {
    
        public static void main(String[] args) {
            List<Item> items = List.of(
                    new Item("B", "C"),
                    new Item("D", "E"),
                    new Item("A", "B"),
                    new Item("E", "F"),
                    new Item("C", "D"));
    
            String from = "B";
            String to = "E";
            items.stream()
                    .sorted(Comparator.comparing(Item::getStart))
                    .dropWhile(item -> !item.getStart().equals(from))
                    .takeWhile(item -> !item.getStart().equals(to))
                    .forEach(item -> System.out.printf("{%s, %s} ", item.getStart(), item.getEnd()));
        }
    
        private static class Item {
            private final String start;
            private final String end;
    
            private Item(String start, String end) {
                this.start = start;
                this.end = end;
            }
    
            public String getStart() {
                return this.start;
            }
    
            public String getEnd() {
                return this.end;
            }
        }
    }
    

    输出:

    {B, C} {C, D} {D, E}