2014-01-14 65 views
2

我有一个字符串数组字符串数组多个对象

String[] weekDays 

平日表示星期几。对于如

{1, 2, 4} means Monday, Tuesday, Thusday 
{2,5,6,7} means Tuesday, Friday, Saturday, Sunday 

我代表7天星期七个布尔和需要设置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语句和执行此我明确地将所有布尔是假的之前那么多。 有没有其他简单的方法来做同样的事情?任何建议?

+1

+1表示努力。例如,我想看看'setSunday'是什么。它看起来像那些'set ..'功能可能对每一天都是不必要的。如果你可以传递一个'set ...'方法的字符串值,它可以完成所有的这一行代码,而不是if或switch。 –

+0

基本上数据库中有7个字段相对于七天来设置所有这些字段有七种方法。 –

+0

七种方法过多。您应该能够根据传递的值以及数据库模式的更多信息隐式引用这些数据库字段。将您设置的方法的代码添加到OP。 –

回答

2

定义枚举是你一周中的几天:

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。

的现在,而不是你的7个布尔使用EnumSet:

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个布尔错误是错误的。

+0

感谢您的回复。但我的问题不是存储这些东西。但是我从一个数组源读取输入并读取该数组,我必须设置七个boolena变量。 –

+0

我的例子就是这样。我将添加更多 –

+0

我无法使用EnumSet。这7个布尔值使用休眠映射为Db中的7个字段。 –

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的领域。

+0

感谢您的回复。但我的问题不是存储这些东西。但是我从一个数组源读取输入并读取该数组,我必须设置七个boolena变量。 –

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而不是七个布尔标志。

1

您可以尝试以下操作:

  1. 添加下面的代码在你的DTO对象

    名单weekDaysList;每个getMonday,getTuesday方法如下

    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. 更新:
 
public boolean getMonday() { 
    return isWeekdaySet("1"); 
} 

public boolean getTuesday(){ 
    return isWeekdaySet("2"); 
} 

我希望这有助于。

+0

hashMap在他的解决方案中有什么用处。 –