使用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 );