Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Enum和Java 8查找wining程序_Java_Java 8_Enums_Rank - Fatal编程技术网

使用Enum和Java 8查找wining程序

使用Enum和Java 8查找wining程序,java,java-8,enums,rank,Java,Java 8,Enums,Rank,我想存储如下数据: (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 因此,我计划使用具有多个值的枚举: publi

我想存储如下数据:

(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
因此,我计划使用具有多个值的枚举:

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;
}
有没有更好的储存方法

另外,我不确定使用流获取opprio的方法的实现。(我可以实施)

方法:getTopPriority(列表程序类型列表){
使用流的impl??
}

gettopriority
可以这样实现:

 ProgramType getTopPriority(List<ProgramType> programTypeList) {
    return programTypeList
            .stream()
            .min(Comparator.comparing(ProgramType::getPrio)).orElse(...);
}
ProgramType获取优先级(列表programTypeList){
返回程序类型列表
.stream()
.min(Comparator.comparing(ProgramType::getPrio)).orElse(…);
}
tl;博士 二月

细节 如果优先级号恰好与枚举定义中每个枚举对象所在位置的序号一致,则问题会变得更简单。也就是说,如果第一个枚举对象的优先级为1,第二个为2,第三个为3,依此类推

枚举对象的示例
列表

List < Month > months = List.of( Month.JUNE , Month.FEBRUARY );
EnumSet
的迭代器顺序恰好是在该enum上定义enum对象的顺序。因此,在我们六月和二月的例子中,二月在集合中排在第一位。我们只是从迭代器中请求第一个对象来解决您的问题

Month month = set.iterator().next();
month.toString():二月

因此,您实际上不需要在枚举中包含
prio
成员字段。通过将一个枚举对象添加到由命名错误的方法
enum::ordinal
返回的
int
中,可以获得每个枚举对象的序号

Month.DECEMBER.ordinal() + 1
十二,

从枚举构造函数中省略
prio
参数。添加一个方法
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.
    }
}
package work.basil.example;
导入java.util.EnumSet;
导入java.util.List;
导入java.util.Objects;
公共枚举程序类型
{
VCX(“VProgram”)、ACF(“AProgram”)、IFL(“IProgram”);
私有字符串显示名;
ProgramType(最终字符串名称)
{
this.displayName=名称;
}
公共字符串getDisplayName()
{
返回此.displayName;
}
公共int getPriorityLevel()
{
int priority=this.ordinal()+1;//`Enum::ordinal`方法命名错误,实际上返回的是一个从零开始的索引号,而不是一个从一开始的序号。
返回优先级;
}
静态程序类型最高优先级(列表<程序类型>程序类型)
{
Objects.requirennoull(programTypes,“收到的程序类型的空列表。消息#539b0b72-d28c-4e54-b82e-2e3b4d760f28”);
if(programTypes.isEmpty(){抛出新的IllegalArgumentException(“未指定程序类型(空列表)。消息#485b0856-a384-4090-aa5f-0d412cb0c8f6”);}
程序类型pt=
枚举集
.copyOf(程序类型)
.iterator()
.next()
;
return pt;//或返回pt.getPriorityLevel(),如果这个数字是您想要的。
}
}
示例用法

List < ProgramType > programTypes = List.of( ProgramType.IFL , ProgramType.ACF );
ProgramType pt = ProgramType.highestPriority( programTypes );
ListprogramTypes=List.of(ProgramType.IFL,ProgramType.ACF);
ProgramType pt=ProgramType.highestPriority(程序类型);
pt.toString()=ACF

pt.getPriorityLevel()=2

pt.getDisplayName()=一个程序


这取决于程序类型数据更改的频率。使用枚举使它们有效地保持静态(即,更改需要重新编译程序)。对于更为动态的方法,您应该考虑从配置文件初始化的数组。请验证这一点,您的查询是“给我最优先的程序名”。您的数据很容易表示吗?我发现
TreeMap
数据结构中的键是优先级,值是程序的集合。
程序类型
将具有
名称
代码
(最终也可以是映射的键)。
优先级是否恰好是枚举中定义的序号,第一个是优先级1,第二个是优先级2,依此类推?如果是,则不需要该优先级字段。将一个添加到命名错误的方法的结果
Enum::ordinal
将返回相同的数字。
Month.DECEMBER.ordinal() + 1
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 );