我想知道是否有2条公交线路交叉(具有公共busStop),然后将这些线路和公交车站返回列表中。
busLine
类没有用于返回停止列表以使用列表操作的方法
例如:我在busLineList的第一个元素上->我得到了该行的第一个busStop->现在检查是否每个其他busLineList
元素是否由列表中的相同busStop组成。
busLineList -> busLine 1 -> busStop A
busStop B
-> busLine 2 -> busStop B
saving to the list: [ busLine 1, busLine 2, busStop B ]
我的实现返回了错误的列表。 返回列表的size()
是我在所有公交线路上使用的每个公交车站的总和。
if()
语句存在问题,因为当我用true
替换条件时,它会产生相同的输出。
/* This list consist of `BusLineInterface` objects which constructor
takes a `List` of `BusStopInterface` objects as parameter.
*/
private static List<BusLineInterface> busLineList;
/* This is `transferList` I want to create which contains `Lists`
of objects: bus x of line "x" that have same busStop with bus y on
line y, bus y, common bus stop
*/
private static List<List<Object>> transferList;
public PathFinder() {
busList = new ArrayList<>();
busLineList = new ArrayList<>();
transferList = new ArrayList<>();
}
public void transferTab() {
for (int i = 0; i < busLineList.size(); i++) {
for (int j = 0; j < busLineList.get(i).getNumberOfBusStops(); j++) {
for (int k = 0; k < busLineList.size(); k++) {
boolean flag = true;
if (i == k) { // Avoiding of checking same Lines
flag = false;
}
if (flag) {
for (int l = 0; l < busLineList.get(k).getNumberOfBusStops(); l++) {
if (busLineList.get(i).getBusStop(j).getName().equals(busLineList.get(k).getBusStop(l).getName())) {
List<Object> transfer = new ArrayList<>();
transfer.add(busLineList.get(i));
transfer.add(busLineList.get(k));
transfer.add(busLineList.get(k).getBusStop(l));
transferList.add(transfer);
}
}
}
}
}
}
}
编辑:添加busLine和busStop方法
private String name;
BusStop(String n) {
this.name = n;
}
@Override
public String getName() {
return name;
}
公交线路:
private static List<BusStop> busStore;
BusLine(List<BusStop> b) {
busStore = new ArrayList<>(b);
}
@Override
public int getNumberOfBusStops() {
return busStore.size();
}
@Override
public BusStopInterface getBusStop(int number) {
return busStore.get(number);
}
答案 0 :(得分:2)
听起来您正在描述两个列表之间的交集。
这将起作用:
List<String> list1 = ...
List<String> list2 = ...
Set<String> intersection = list1.stream()
.filter(item -> list2.contains(item))
.collect(Collectors.toSet());
答案 1 :(得分:0)
概念是相同的。在内部,“。contains”使用“ .equals”检查项目是否已在列表中。如果这还不够,请使用getName()方法按名称将一个停靠站与另一个停靠站进行比较。如下:
// Convert the list of bus stops to a set of names.
Set<String> line1Stops = busLine1.stream()
.map(stop -> stop.getName())
.collect(Collectors.toSet());
// Create an intersection set by comparing the names in
// list 1 against the names in list 2.
Set<String> intersection = busLine2.stream()
.map(stop -> stop.getName())
.filter(name -> line1Stops.contains(name))
.collect(Collectors.toSet());