Повторяющаяся карта списка для входа - PullRequest
0 голосов
/ 04 июня 2018

Это относится к Java 7.
У нас есть список предметов в порядке приоритета List<SubjectId>
Существует Карта студентов к списку предметов, выбранных для - Map<StudentId,List<SubjectId>>
Цель -чтобы найти предмет с наивысшим приоритетом, выбранный всеми (общий знаменатель), и вернуть его в виде карты для всех учащихся.

Входные данные:

List<SubjectId>=['1021','1023','1025']

Map<StudentId,List<SubjectId>>={'1',['1025,'1027'];'2',['1021',1025'];'3',['1022','1025']}

Output Map = {'1','1025';'2','1025';'3','1025'}

В данный момент мы повторяем весь списокстуденты по каждому предмету - составляя выходную карту по пути.
Если предмет найден отсутствующим для любого - карта отбрасывается - и мы переходим к следующему предмету.

Есть ли ещеэффективный O (N) подход?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018
    //subjects in order of priority
    List<String> list = Arrays.asList("1021", "1023", "1025", "1027");

    Map<String, List<String>> map = new HashMap<>();
    map.put("1", Arrays.asList("1021","1025", "1027"));
    map.put("2", Arrays.asList("1021", "1025"));
    map.put("3", Arrays.asList("1023", "1025", "1021"));

    //intersect
    Set<String> intersection = map.values().stream().map(HashSet::new)
        .collect(() -> new HashSet<>(list), Set::retainAll, Set::retainAll);

    //find highest priority
    Optional<String> first = list.stream().filter(intersection::contains).findFirst();
    System.out.println("first = " + first.orElse(""));
0 голосов
/ 04 июня 2018

Насколько я понимаю, ВСЕ студенты, должно быть, выбрали предмет для его выбора.Если это так, это значительно упрощает решение.

Вам нужна карта вывода?Почему бы просто не вывести получившийся предмет, поскольку карта всегда будет повторять его для всех учащихся.

Одним из простых решений, которое я могу придумать быстро, было бы использование функции stream, доступной для коллекций (https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--), а затем используйте функцию filter (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate-) на карте учащихся + выбранные предметы, чтобы отфильтровать невыбранные предметы из списка, содержащего все доступные предметы.

Вытакже потребуется создать собственный предикат, который будет проходить по всем предметам каждого учащегося, что может быть не так оптимизировано, как хотелось бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...