基本實現原理:
用一個字節就可以記錄選中狀態,其中1表示選中,0表示未選中,位置代表星期的位置。
代碼實現如下:
/**
* Days of week code as a single int.
* 0x00: no day
* 0x01: Monday
* 0x02: Tuesday
* 0x04: Wednesday
* 0x08: Thursday
* 0x10: Friday
* 0x20: Saturday
* 0x40: Sunday
*/
public final class DaysOfWeek {
private static int[] DAY_MAP = new int[] {
Calendar.MONDAY,
Calendar.TUESDAY,
Calendar.WEDNESDAY,
Calendar.THURSDAY,
Calendar.FRIDAY,
Calendar.SATURDAY,
Calendar.SUNDAY,
};
// Bitmask of all repeating days
private int mDays;
DaysOfWeek(int days) {
mDays = days;
}
public String toString(boolean showNever) {
StringBuilder ret = new StringBuilder();
// no days
if (mDays == 0) {
return showNever ? "一律不" : "";
}
// every day
if (mDays == 0x7f) {
return "每天";
}
// count selected days
int dayCount = 0, days = mDays;
while (days > 0) {
if ((days & 1) == 1) dayCount++;
days >>= 1;
}
// short or long form?
DateFormatSymbols dfs = new DateFormatSymbols();
String[] dayList = (dayCount > 1) ?
dfs.getShortWeekdays() :
dfs.getWeekdays();
// selected days
for (int i = 0; i < 7; i++) {
if ((mDays & (1 << i)) != 0) {
ret.append(dayList[DAY_MAP[i]]);
dayCount -= 1;
if (dayCount > 0) ret.append(", ");
}
}
return ret.toString();
}
// 判斷第幾位是否被選中
private boolean isSet(int day) {
/*
* 如day爲第三位
* (1 << day) 即爲:00000100
* 00000100 與 mDays,只有當Days第三位爲1時,纔不等於0
*/
return ((mDays & (1 << day)) > 0);
}
public void set(int day, boolean set) {
if (set) {
mDays |= (1 << day);
} else {
mDays &= ~(1 << day);
}
}
public void set(DaysOfWeek dow) {
mDays = dow.mDays;
}
public int getCoded() {
return mDays;
}
// Returns days of week encoded in an array of booleans.
public boolean[] getBooleanArray() {
boolean[] ret = new boolean[7];
for (int i = 0; i < 7; i++) {
ret[i] = isSet(i);
}
return ret;
}
public boolean isRepeatSet() {
return mDays != 0;
}
/**
* returns number of days from today until next alarm
* @param c must be set to today
*/
public int getNextAlarm(Calendar c) {
if (mDays == 0) {
return -1;
}
int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
int day = 0;
int dayCount = 0;
for (; dayCount < 7; dayCount++) {
// 今天加上將要發生的天數(1-7)
day = (today + dayCount) % 7;
if (isSet(day)) {
break;
}
}
return dayCount;
}
}
調用方法:
DaysOfWeek daysOfWeek = new DaysOfWeek(0x00); // 初始化一個選中狀態
daysOfWeek.set(0, true); // 設置星期一選中
daysOfWeek.set(1, true); // 設置星期二選中
daysOfWeek.set(0, false); // 取消星期一的選中
// 獲取選中的星期,第0位代表星期一
boolean[] weekBool = daysOfWeek.getBooleanArray();