字符串数组到多个对象

时间:2014-01-14 11:44:24

标签: java arrays string if-statement logic

我有一个字符串数组

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。 有没有其他简单的方法来做同样的事情?有什么建议??

4 个答案:

答案 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)

您可以尝试以下操作:

  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);
    }
    
  2. 更新每个getMonday,getTuesday方法,如下所示:
  3. 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个布尔标记。