浏览多个列表以查找相等的对象

时间:2018-11-28 20:54:24

标签: java list duplicates

我想知道是否有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);
}

2 个答案:

答案 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());