Поиск программы выигрыша с использованием перечислений и Java 8 - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу хранить данные вроде:

(VCX, 1, VProgram), (ACF, 2, AProgram), (IFL, 3, IProgram) - //[ProgramType, priority, programName]

Input: inputProgramTypes: {ABC, VCX, IFL}

Output: winning programName based on priority // In this case: VProgram

Так что я планирую использовать Enum с несколькими значениями:

public enum ProgramType {
VCX("VProgram", 1),
ACF("AProgram", 2),
IFL("IProgram", 3);

ProgramType(final String name) {
    this.name = name;
}

ProgramType(final String name, final int prio) {
    this.name = name;
    this.prio = prio;
}

Есть ли лучший способ хранения?

Кроме того, я не уверен в реализации метода getTopPrio с использованием потоков. (Могу реализовать)

method: getTopPriority(List<> programTypeList) {
    impl using streams??
}

Ответы [ 2 ]

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

tl; dr

EnumSet
.copyOf( List.of( Month.JUNE , Month.FEBRUARY ) )
.iterator()
.next()
.toString()

ФЕВРАЛЬ

Подробности

Если ваш приоритетный номер совпадает с порядковым номером каждого объекта перечисления место в определении enum, ваша проблема становится проще. То есть, если приоритет первого объекта перечисления равен 1, а второго - 2, а третий - 3 и т. Д.

Пример List объектов перечисления.

List < Month > months = List.of( Month.JUNE , Month.FEBRUARY );

EnumSet - это реализация Set, оптимизированная для обработки объектов enum. EnumSet занимает мало памяти и выполняется очень быстро.

Set < Month > set = EnumSet.copyOf( months );

Порядок итератора EnumSet соответствует порядку, в котором объекты перечисления определены в этом перечислении. Таким образом, в нашем примере с июня по февраль февраль стоит первым в наборе. Мы просто запрашиваем первый объект у его итератора для решения вашего вопроса.

Month month = set.iterator().next();

month.toString (): ФЕВРАЛЬ

Так что вам на самом деле не нужно имейте это prio поле участника в вашем перечислении. Вы можете получить порядковый номер каждого объекта перечисления, добавив его к int, возвращенному ошибочно названным методом Enum::ordinal.

Month.DECEMBER.ordinal() + 1

12

Пропустить prio аргумент вашего конструктора enum. Добавить метод getPriority.

package work.basil.example;

import java.util.EnumSet;
import java.util.List;
import java.util.Objects;

public enum ProgramType
{
    VCX( "VProgram" ), ACF( "AProgram" ), IFL( "IProgram" );

    private String displayName;

    ProgramType ( final String name )
    {
        this.displayName = name;
    }

    public String getDisplayName ( )
    {
        return this.displayName;
    }

    public int getPriorityLevel ( )
    {
        int priority = this.ordinal() + 1;  // `Enum::ordinal` method is misnamed, actually returning a zero-based index number rather than one-based ordinal number.
        return priority;
    }

    static ProgramType highestPriority ( List < ProgramType > programTypes )
    {
        Objects.requireNonNull( programTypes , "Received null list of program types. Message # 539b0b72-d28c-4e54-b82e-2e3b4d760f28." );
        if ( programTypes.isEmpty() ) { throw new IllegalArgumentException( "No program types specified (empty list). Message # 485b0856-a384-4090-aa5f-0d412cb0c8f6." );}

        ProgramType pt = 
                EnumSet
                .copyOf( programTypes )
                .iterator()
                .next()
        ;

        return pt ;  // Or return pt.getPriorityLevel() if the number was your intention.
    }
}

Пример использования.

List < ProgramType > programTypes = List.of( ProgramType.IFL , ProgramType.ACF );
ProgramType pt = ProgramType.highestPriority( programTypes );

pt.toString () = ACF

pt.getPriorityLevel () = 2

pt.getDisplayName () = AProgram

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

getTopPriority может быть реализовано так:

 ProgramType getTopPriority(List<ProgramType> programTypeList) {
    return programTypeList
            .stream()
            .min(Comparator.comparing(ProgramType::getPrio)).orElse(...);
}
...