2014-01-14 4 views
2

У меня есть массив строкмассив строк к нескольким объектам

String[] weekDays 

будние дни представляет дни недели. для например

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

У меня есть семь булевых, представляющие 7 дней недели и должен установить истинные или ложными на основе будней.

Мой код

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); 
     } 
    } 
} 

Но это так много, если другого заявления и перед выполнением этого я явно установить все булевы ложными. Есть ли другой простой способ сделать то же самое? Любое предложение ??

+1

+1 для показа усилий. Я хотел бы посмотреть, что, например, делает setTunday. Мне кажется, что эти функции «set ..» могут быть излишне специфичными для каждого дня. Если вы можете передать метод «set ...» значение строки, и он делает XYZ, вы можете сделать все это с одной строкой кода, а не с if или switch. –

+0

В основном в базе данных имеется 7 полей в течение семи дней, чтобы установить все эти поля, существует семь методов. –

+0

Семь методов являются чрезмерными. Вы должны иметь возможность неявно ссылаться на эти поля БД на основе переданного значения и дополнительной информации о вашей схеме БД. Добавьте код ваших методов набора в OP. –

ответ

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, если нет совпадения - или соответствующий день недели.

Теперь вместо того, чтобы ваши 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 булевых отображены с 7 полями в Db, использующими спящий режим. –

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;

    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 следующим образом:
 
public boolean getMonday() { 
    return isWeekdaySet("1"); 
} 

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

Я надеюсь, что это помогает.

+0

Каково использование hashMap в его решении. –

Смежные вопросы