Приоритетные структуры данных и поиск выигрышной программы с использованием Java 8 потоков - PullRequest
1 голос
/ 17 апреля 2020

У меня есть список типов программ:

List<String> programTypes = {ACF, VCX, IFL}
Note: This is a map hardcoded in code.

Here, I want to attach priorities to these programTypes: 
ACF->priority=2, VCX->priority=1, IFL->priority=3

Какую структуру данных я должен использовать? Приоритетные очереди?

Кроме того, теперь у меня есть список типов inputProgramTypes: {AB C, VCX, IFL} Я хочу, чтобы выходной сигнал был выигрышным ProgramType: VCX

Я могу закодировать его итерация на inputProgramTypes и установка winProgramType, если у каждого следующего приоритет выше установленного (например, при поиске максимальной проблемы).

Но я хочу знать, могу ли я оптимизировать? И как я могу использовать потоки, чтобы написать код для того же, чтобы он выглядел чистым? Я новичок в потоках и изучаю свой путь через него.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Я предлагаю вам использовать перечисление с конструктором параметров.

Таким образом, метод public static Map<ProgramType, Integer> getPrioMap() будет элегантно и безопасным для типа способом возвращать необходимую вам структуру данных.

public enum ProgramType {

    ACF(2), VCX(1), IFL(3);

    private int prio;

    private ProgramType(int prio) {
        this.prio = prio;
    }

    public Integer getPriority() {
        return prio;
    }

    public static Map<ProgramType, Integer> getPrioMap() {
        return List.of(ProgramType.values()).stream()
                .collect(Collectors.toMap(e -> e, e -> e.getPriority()));
    }
}
0 голосов
/ 17 апреля 2020

Использование SortedMap интерфейса и его реализация TreeMap:

SortedMap<Integer, List<String>> map = new TreeMap<>();
map.put(2, Collections.singletonList("ACF"));
map.put(1, Collections.singletonList("VCX"));
map.put(3, Collections.singletonList("IFL"));

Преимущества:

  • Ключи отсортированы, вы можете управлять их порядком, определяя Comparator в конструкторе new TreeMap<>(comparator);. Порядок обработки из вышеприведенного примера будет следующим:

    map.values().forEach(System.out::print);
    // [VCX][ACF][IFL]
    
  • Если больше строк имеют одинаковый приоритет, List<String> в качестве значений карты являются более подходящими.

  • Добавление нового приоритета (ключа) и значения (List<String>) на карту не нарушит отсортированные характеристики. Для безопасного добавления я рекомендую Map::computeIfPresent.
0 голосов
/ 17 апреля 2020

Возможно, подойдет простая карта:

    public Map<String, Integer> buildMapOfPriorityProgramTypes() {
        Map<String, Integer> priorityProgramTypes = new HashMap<>();
        priorityProgramTypes.put("ACF", 2);
        priorityProgramTypes.put("VCX", 1);
        priorityProgramTypes.put("IFL", 3);
        return priorityProgramTypes;
    }

    public String getTopPriorityType(Map<String, Integer> priorityTypes) {

        return priorityTypes.entrySet().stream()
                .min(Map.Entry.comparingByValue())
                .get().getKey();

    }

Если вы используете Java 9 или новее, вы можете использовать более короткую Map.of:

Map<String, Integer> priorityProgramTypes = Map.of(
  "ACF", Integer.valueOf(2),
  "VCX", Integer.valueOf(1),
  "IFL", Integer.valueOf(3)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...