Java周天数计算

Java周天数计算,java,enums,days,Java,Enums,Days,我有一个星期天(包括每天、周末和工作日)的枚举,如下所示,其中每个条目都有一个int值 public enum DaysOfWeek { Everyday(127), Weekend(65), Weekdays(62), Monday(2), Tuesday(4), Wednesday(8), Thursday(16), Friday(32), Saturday(64), Sunday(1); private int bitValue;

我有一个星期天(包括每天、周末和工作日)的枚举,如下所示,其中每个条目都有一个int值

public enum DaysOfWeek {


  Everyday(127),
  Weekend(65),
  Weekdays(62), 
  Monday(2),
  Tuesday(4),
  Wednesday(8),
  Thursday(16),
  Friday(32), 
  Saturday(64),
  Sunday(1);

  private int bitValue;

  private DaysOfWeek(int n){
    this.bitValue = n;
  }

  public int getBitValue(){
    return this.bitValue;
  }
}

给定所有值的组合,计算所有单个值并从中生成arraylist的最简单方法是什么。例如,给定数字56(即Wed+Thur+Fri),如何计算天数。

表示枚举值集合的正确方法是使用。这在内部使用位向量。但是,在代码中公开这样的实现细节并不是一个好主意。我们在这里做OO,不是一点玩弄

此外,您将单个值和一组值的概念混合在一起,这可能会导致以后的麻烦

使用Java 8及更高版本中内置的枚举的示例

EnumSet<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

Boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() );
EnumSet weekend=EnumSet.of(DayOfWeek.SATURDAY,DayOfWeek.SUNDAY);
布尔值isTodayWeekend=weekend.contains(LocalDate.now().getDayOfWeek());

正如Michael所建议的,不要向外界公开此实现细节。 创建将int位掩码转换为EnumSet的静态方法:

public static EnumSet< DaysOfWeek > fromBitValues (
        final int origBitMask
    )
{
    final EnumSet< DaysOfWeek > ret_val =
        EnumSet.noneOf( DaysOfWeek.class );

    int bitMask = origBitMask;

    for ( final DaysOfWeek val : DaysOfWeek.values( ) )
    {
        if ( ( val.bitValue & bitMask ) == val.bitValue )
        {
            bitMask &= ~val.bitValue;

            ret_val.add( val );
        }
    }

    if ( bitMask != 0 )
    {
        throw
            new IllegalArgumentException(
                String.format(
                    "Bit mask value 0x%X(%d) has unsupported bits " +
                    "0x%X.  Extracted values: %s",
                    origBitMask,
                    origBitMask,
                    bitMask,
                    ret_val
                )
            );
    }

    return ret_val;
}
publicstaticenumsetfromBitValues(
最终int origBitMask
)
{
最终枚举集返回值=
EnumSet.noneOf(DaysOfWeek.class);
int位掩码=origBitMask;
对于(最终DaysOfWeek val:DaysOfWeek.values())
{
if((val.bitValue和位掩码)==val.bitValue)
{
位掩码&=~val.bitValue;
返回值添加(val);
}
}
如果(位掩码!=0)
{
扔
新的非法辩论例外(
字符串格式(
“位掩码值0x%X(%d)具有不受支持的位”+
“0x%X.提取的值:%s”,
origBitMask,
origBitMask,
位掩码,
回程
)
);
}
返回返回值;
}
您可能还需要一个将枚举集转换为位掩码的静态方法,我将此练习留给读者


另外,看看你的枚举,每天、周末和工作日都不属于那里。它们是其他DaysOfWeek值的集合,因此应定义为枚举集。

此处不能使用62、65、127。您需要1、2、4、8、16、32、64、128、256和512才能“简单地”工作(我还不能从头顶上说出来,但其他人会这么做)。@BalusC:这些值是预定义的组合,不打算进一步组合。或者,如果您使用按位或(
|
)而不是加法形成“总计”(
+
)然后,像65或127这样的位组合也可以工作。我想我不需要enum中的工作日、周末和每天。仅供参考,Java 8和更高版本现在包括一周七天中的每一天的enum,即周一到周日。谢谢。如果我从enum中删除每天、周末和工作日,改用Enumset,我将如何计算从中的天数给定的总数。@Shahid:您应该完全停止使用int“total”,而在任何地方都使用枚举集。每天、Wekkdays和周末都是公共静态最终枚举集实例,包装为不可修改。然后您可以复制这些实例并添加()和删除()天,或者使用EnumSet.of()构建其他组合。可能需要序列化位集并将其传递给非Java应用程序,为此,可能需要将位转换为枚举集,反之亦然。如果枚举仅用于Java,那么我同意您的看法,这些位完全没有必要。