gpt4 book ai didi

Java 流 : filtering with 2 objects

转载 作者:行者123 更新时间:2023-12-01 18:55:35 26 4
gpt4 key购买 nike

我有一个问题,我有一组连接两个地方的道路,并且我想在没有直接连接的情况下找到从 A 到 B 的所有连接,因此行程将从 A 到 X(甚至可能到 Y)到 B。然而,当我已经知道没有直接连接时,我现在不知道如何过滤,因为我认为我需要超过 1 个对象。

routes = allroutes
.stream()
.filter(p -> p.getStart() == start)
.filter(p,x -> p.getEnd() == x.getStart())
.filter(x -> x.getEnd() == end)

和过滤器(p,x ....) 是不起作用的,但我不知道如何以不同的方式解决它。当然,所有流、列表等之前都已正确初始化。

最佳答案

由于您在这里同时需要列表中的两个值,因此我不确定使用流来实现此目的的方法。 (其他人可能会发表评论。)但是,由于我发现这个问题很有趣,所以我很快在一个简单的 Java 类上进行了尝试。我使用了一个简单的 for..each 循环而不是 Java 流。

public class RouteFinder{

public static void main( String[] args ){
List<Route> allroutes = new ArrayList<>();
populateData( allroutes );

findIndirectBetween( allroutes, "A", "B" ).forEach( System.out::println );
}

private static List<Route> findIndirectBetween( List<Route> allroutes, String start, String end ){
List<Route> selected = new ArrayList<>();
if( start.equals( end ) ) return selected;

for( Route route : allroutes ) {
List<String> rStops = route.getStops();
if( !rStops.contains( start ) || !rStops.contains( end ) ) continue;

int startIndex = rStops.indexOf( start );
int endIndex = rStops.indexOf( end );
if( startIndex != endIndex + 1 && startIndex != endIndex -1 ) selected.add( route );
}

return selected;
}

private static void populateData( List<Route> routes ) {
routes.add( Route.of( "1", "A", "H", "C", "B" ) );
routes.add( Route.of( "2", "A", "B" ) );
routes.add( Route.of( "3", "C", "K", "L", "Z" ) );
routes.add( Route.of( "4", "C", "L", "Z" ) );
routes.add( Route.of( "5", "C", "B", "Z", "A" ) );
}

private static class Route{
private String routeNumber;

private List<String> stops = new ArrayList<>();

public Route( String routeNumber, List<String> stops) {
super();
this.routeNumber = routeNumber;
this.stops = stops;
}

public static Route of( String number, String... stops ) {
List<String> ss = new ArrayList<>();
if( stops != null ) for( String s : stops ) ss.add( s );

return new Route( number, ss );
}

public String getStart() {
if( this.stops != null && this.stops.size() > 0 ) return this.stops.get( 0 );
return "";
}

public String getEnd() {
if( this.stops != null && this.stops.size() > 0 ) return this.stops.get( this.stops.size() - 1 );
return "";
}

public List<String> getStops(){
return this.stops;
}

public String getRouteNumber(){
return routeNumber;
}

@Override
public String toString(){
return "routeNumber=" + routeNumber + ", stops=" + stops;
}
}
}

编辑:

再考虑一下,我认为有一种方法可以使用流来做到这一点。

private static List<Route> findIndirectBetweenUsingStreams( List<Route> allroutes, String start, String end ){
return allroutes.stream()
.filter( r -> r.getStops().contains( start ) ) //Retain routes which have "start"ing point
.filter( r -> r.getStops().contains( end ) ) //Retain routes which have "end" point
.collect( ArrayList::new, ( newRouteList, r ) -> {
List<String> rStops = r.getStops();
int startIndex = rStops.indexOf( start );
int endIndex = rStops.indexOf( end );
if( startIndex != endIndex + 1 && startIndex != endIndex -1 ) newRouteList.add( r );
},
( newRouteList, r ) -> {} );
}

此代码使用模型 Route 和我上面粘贴的类中的基本代码。可以调用此方法来代替 findIndirectBetween()

关于Java 流 : filtering with 2 objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59675387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com