Java星期的複選運算

基本實現原理:

weekTheory

用一個字節就可以記錄選中狀態,其中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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章