Java星期的复选运算
2015-12-09 15:19
447 查看
基本实现原理:
用一个字节就可以记录选中状态,其中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();
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统