Просмотр нескольких списков, чтобы найти одинаковые объекты - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу знать, пересекаются ли 2 автобусные линии (имеют общий busStop), а затем вернуть эти линии и автобусную остановку в список. Класс busLine не имеет метода, который возвращает список остановок для использования операций со списками

Например: Im на 1-м элементе busLineList -> Я получаю 1-й 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 голосов
/ 29 ноября 2018

Концепция такая же.Внутренне «.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());
0 голосов
/ 29 ноября 2018

Похоже, вы описываете пересечение между двумя списками.

Это будет работать:

List<String> list1 = ...
List<String> list2 = ...

Set<String> intersection = list1.stream()
                               .filter(item -> list2.contains(item))
                               .collect(Collectors.toSet());
...