2014-01-14 98 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在他的解決方案中有什麼用處。 –