bbe*_*ard 1 java sqlite enums casting bit-manipulation
这就是我想要做的.我有一个每周包含多天的字段.(例如,它可以存储星期一或星期一|星期二,或星期三|星期五) - 基本上任何组合.
为此,我使用了权力为2的枚举,如下所示:
public enum DayOfWeek {
Monday(1),
Tuesday(2),
Wednesday(4),
Thursday(8),
Friday(16),
Saturday(32),
Sunday(64);
private final int index;
DayOfWeek(int index) {
this.index = index;
}
public int value() {
return index;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在数据库中存储一个整数,如下所示:
DayOfWeek days = DayOfWeek.Monday | DayOfWeek.Thursday; // Monday and Thursday
int daysAsInt = (DayOfWeek)days; // Value to save
Run Code Online (Sandbox Code Playgroud)
我可以测试这些日子
if ((days & DayOfWeek.Monday) == DayOfWeek.Monday) /* If days contains Monday */
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何将整数值转换回DayOfWeek.我以为我可以施展它(DayOfWeek)daysAsInt.但它不起作用.
任何建议将非常感激.
你的枚举是一周中的每个日子 - 类型的变量DayOfWeek应该只指一天.如果您尝试存储多个值,则应该查看EnumSet:
EnumSet<DayOfWeek> days = EnumSet.of(DayOfWeek.Monday, DayOfWeek.Wednesday);
int valueToStore = setToValue(days);
Run Code Online (Sandbox Code Playgroud)
后来:
int valueRetrieved = ...;
EnumSet<DayOfWeek> days = valueToSet(days);
Run Code Online (Sandbox Code Playgroud)
这些方法声明为:
static int setToValue(EnumSet<DayOfWeek> days) {
int value = 0;
for (DayOfWeek day : days) {
value |= day.value();
}
return value;
}
static EnumSet<DayOfWeek> valueToSet(int value) {
EnumSet<DayOfWeek> days = EnumSet.noneOf(EnumSet.class);
for (DayOfWeek day : EnumSet.allOf(EnumSet.class)) {
if ((value & day.value()) != 0) {
days.add(day);
}
}
return days;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |