Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Java 从表示某些工作日的枚举中获取枚举值的好方法是什么_Java - Fatal编程技术网

Java 从表示某些工作日的枚举中获取枚举值的好方法是什么

Java 从表示某些工作日的枚举中获取枚举值的好方法是什么,java,Java,我有一个ENUM,只有3个常量。根据名为weekend的标志,ENUM.values()应返回3或2个常量 public enum Weekday { SUNDAY, MONDAY, TUESDAY; } public Weekday[] getDays() { boolean weekend = true; if (weekend){ return Weekday.values() // this will reurn SUNDAY, MONDAY,

我有一个
ENUM
,只有3个常量。根据名为
weekend
的标志,ENUM.values()应返回3或2个常量

public enum Weekday { 
    SUNDAY, MONDAY, TUESDAY;
}

public Weekday[] getDays() {
    boolean weekend = true;
    if (weekend){
        return Weekday.values() // this will reurn SUNDAY, MONDAY, TUESDAY
    } else { // when weekend is false
         return Weekday.values() // it should return on MONDAY, TUESDAY
      }
}
请建议,实现这一目标的合理方法是什么。我能够实现它与下面的代码。不幸的是,公关审查员对此似乎并不高兴。你能建议一个更好的方法吗

我的解决方案

 EnumMap<Weekday, Integer> days= new EnumMap<>(Weekday.class);
    days.put(Weekday.MONDAY, 1);
    days.put(Weekday.TUESDAY, 2);

    return days.keySet().toArray(new Weekday[0]); // this returns MONDAY and TUESDAY.
EnumMap days=新的EnumMap(Weekday.class);
天。放置(工作日。星期一,1);
天。放置(工作日。星期二,2);
return days.keySet().toArray(新的工作日[0]);//星期一和星期二返回。
那么:

 public enum Weekday {
        SUNDAY, MONDAY, TUESDAY;
    }

    public Weekday[] getDays() {
        boolean weekend = callFromSomeAPI();
        return weekend ? Weekday.values() : new Weekday[] {Weekday.MONDAY, Weekday.TUESDAY};
    }
当然,在Enum
工作日的更典型用法中
将表示一周中的所有7天,并使用变量(例如,
周末
工作日
)来区分周日和周末。比如:

enum Weekday {
    MONDAY(false),
    TUESDAY(false),
    WEDNESDAY(false),
    THURSDAY(false),
    FRIDAY(false),
    SATURDAY(true),
    SUNDAY(true);

    private final boolean weekend;

    Weekday(boolean weekend) {
        this.weekend = weekend;
    }

    public static Weekday[] getDays(boolean weekend) {
        return Arrays.stream(values()).filter(i -> i.weekend == weekend).toArray(Weekday[]::new);
    }
}
答案是正确的。我要补充几点

DayOfWeek
Java在Java.time包中提供您的枚举:

无需为此目的在此处定义自己的枚举

不可修改的
列表
您可以使用方便的方法返回
列表,而不是数组

……还有

public List< DayOfWeek > getDays() {
    boolean weekend = callFromSomeAPI();
    return weekend ? WEEKEND : FIRST_WEEKDAYS ;
}
EnumSet
该类提供了类似的
方法,但:

  • 是可修改的
  • 对于保存枚举对象进行了高度优化,可以快速 在占用很少内存的情况下执行
EnumSet
迭代器按枚举定义的顺序返回枚举。在
DayOfWeek
中,按照标准,顺序为周一至周日。因此,如果你认为星期天是第一天,这种方法可能不适用(如果是这样,请坚持使用
列表

SetgetDays(字符串标志)
{
if(flag.equalsIgnoreCase(“weekend”)//最好使用枚举作为标记,而不是容易出错的字符串。
{
返回EnumSet.of(DayOfWeek.SUNDAY,DayOfWeek.MONDAY,DayOfWeek.周二));//请注意:此枚举集将按星期一-星期二-星期日顺序迭代,即它们在枚举中的定义顺序。
}否则
{
返回EnumSet.of(DayOfWeek.MONDAY,DayOfWeek.周二));
}
}

@dreamcrash我觉得你的代码不错。我会试试这个,看看它是否能让评论满意:)谢谢
static final List< DayOfWeek > WEEKEND = List.of( DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ;
static final List< DayOfWeek > FIRST_WEEKDAYS = List.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ;
public List< DayOfWeek > getDays() {
    boolean weekend = callFromSomeAPI();
    return weekend ? WEEKEND : FIRST_WEEKDAYS ;
}
… whatever.getDays().toArray( new DayOfWeek[0] ) …
Set< DayOfWeek > getDays( String flag )  
{
    if ( flag.equalsIgnoreCase( "weekend" ) ) // Better to use an enum as your flag rather than error-prone strings. 
    {
        return EnumSet.of( DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ) ;  // Be aware: This EnumSet will iterate in Monday-Tuesday-Sunday order, the order of their definition in the Enum. 
    } else 
    {
        return EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ) ;
    }
}