我有一个字符串数组
String[] weekDays
weekDays代表星期几。例如
{1, 2, 4} means Monday, Tuesday, Thusday
{2,5,6,7} means Tuesday, Friday, Saturday, Sunday
我有七个布尔值代表一周中的7天,并且必须在weekDays的基础上设置true或false。
我的代码
private static void setWeekDays(final Object object, final String[] weekDays) {
for (String day : weekDays) {
if( day.equalsIgnoreCase("1")) {
object.setMonday(true);
} else if( day.equalsIgnoreCase("2")) {
object.setTuesday(true);
} else if( day.equalsIgnoreCase("3")) {
object.setWednesday(true);
} else if( day.equalsIgnoreCase("4")) {
object.setThrusday(true);
} else if( day.equalsIgnoreCase("5")) {
object.setFriday(true);
} else if( day.equalsIgnoreCase("6")) {
object.setSaturday(true);
} else if( day.equalsIgnoreCase("7")) {
object.setSunday(true);
}
}
}
但它有如此多的if else语句,在执行此操作之前,我明确将所有布尔值设置为false。 有没有其他简单的方法来做同样的事情?有什么建议??
答案 0 :(得分:3)
我认为您可以尝试使用ENUM。
例如
public enum WeekDay {
MONDAY("1");
private String value;
private WeekDay(String value) {
this.value = value;
}
public static WeekDay find(String value) {
for (WeekDay weekDay : values()) {
if (weekDay.value.equals(value)) {
return weekDay;
}
}
}
那么您可以将此ENUM用作DTO的字段。
答案 1 :(得分:2)
将Enum定义为您一周的日子:
enum DayOfWeek {
MONDAY, TUESDAY, etc.
}
创建一个从字符串到日期的地图:
Map<String, DayOfWeek> dayByString = new HashMap<String, DayOfWeek>();
使用您想要的所有查找填充地图,例如
dayByString.put("1", DayOfWeek.MONDAY);
dayByString.put("2", DayOfWeek.TUESDAY);
现在来看看这一天:
DayOfWeek day = dayByString.get(str);
如果没有匹配 - 或者一周的匹配日期,则返回null。
现在使用EnumSet而不是你的7个布尔值:
Set<DayOfWeek> days = new EnumSet<DayOfWeek>(DayOfWeek.class);
在内部,将使用位域来表示日期,因此将非常快速且节省空间。
设置标志为days.add(day);
取消设置days.remove(day);
要检查是否设置了days.contains(day);
或days.contains(DayOfWeek.MONDAY);
。
private static void setWeekDays(EnumSet<DayOfWeek> set, final String[] weekDays) {
set.clear();
for (String day : weekDays) {
set.add(dayByString.get(day));
}
}
你已经完成了,这就是你所需要的一切。
EnumSet是存储它的正确方法。还有其他选择,但7个布尔都是错误的。
答案 2 :(得分:1)
您可以尝试以下操作:
在DTO对象中添加以下代码
列出weekDaysList;
private void setWeekDays(String[] weekDays){
weekDaysList = Arrays.asList(weekDays);
}
private boolean isWeekdaySet(String weekday){
if (weekDaysList == null || weekDaysList.size() == 0){
return false;
}
return weekDaysList.contains(weekday);
}
public boolean getMonday() { return isWeekdaySet("1"); } public boolean getTuesday(){ return isWeekdaySet("2"); }
我希望这会有所帮助。
答案 3 :(得分:0)
如果无法修改DTO类,您可以尝试先前进行方法映射,并使用反射来调用目标方法,如下所示:
private static Method[] methods;
private static void init() throws Exception {
Class klass = BusTravelDetailDTO.class;
String[] methodNames = new String[]{null, "setMonday", "setTuesday", "setSunday"};
methods = new Method[methodNames.length];
for (int i = 0; i < methods.length; i++) {
if(methodNames[i] != null) {
methods[i] = klass.getMethod(methodNames[i], Boolean.class);
}
}
}
private static void setWeekDays(final Object object, final String[] weekDays) {
for (String day : weekDays) {
methods[Integer.parseInt(day)].invoke(object, Boolean.TRUE);
}
}
但是,由于您只有七个选择,if-else
可能是最简单有效的方法。
如果DTO类可以修改,请使用enum
而不是7个布尔标记。