powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / множественные switch case
15 сообщений из 15, страница 1 из 1
множественные switch case
    #36092115
Vetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята!
дайте критику нижеприведенному алгоритму или помогите оптимизировать работу алгоритма
вот код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
            for  (FSObject fsobj = cursor.getRange(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (String) (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }
                 if  (!(cashDate.trim().equals("")) && cashDate.trim().length() >  0 ){
                    cashDateFld = (fsobj.getField(RDDB.FLD_RD_RD_DATE)).getStringValue();
                     int  comparison = cashDateFld.compareTo(cashDate);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }
                rdList.add(fsobj);
            }
            cursor.close();

здесь, в цикле перебираем значения из DAO и сравниваем их со значениями введенными в форму

xxxEq тоже значения с формы, меняю условия соответствия данных

и таких полей на форме больше 20, код стал очень громоздким. посоветуйте, что тут можно сделать??
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
множественные switch case
    #36092124
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Вспомнить про полиморфизм
2) Нафига там вообще switch если на if-ах тоже самое смотрелось бы понятнее.

Количество Case не может рости? Почему бы для начала не избавится от copy-paste и просто вызывать метод?
...
Рейтинг: 0 / 0
множественные switch case
    #36092171
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долго думал что ответить...
Во-первых нивкакую не понял чем отличаются обработка case-ов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :

при любом условии вызывается continue m1;break;
Хотя возможно вы привели не полностью рабочий код, а просто примерную структуру, тогда еще ладно,
Но вот чего все равно никак не могу понять это наличие 6 условий после вызова метода compareTo(), а я то наивный думал их все три - больше, меньше и равно, а больше либо равно уже включает один из этих вариантов, так что этот код можно смело выкинуть ибо он бесполезен.
Итак осталось три условия, которые вполне ложатся на if? else if
Далее порадовала проверка строки на пустое значение, хотя многие и не знают об этом но есть либа commons-lang, там поищите что-то вроде StringUtils.isBlank().
П,С, это все-таки стеб? слишком уж говнокодисто как-то
...
Рейтинг: 0 / 0
множественные switch case
    #36092191
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поменять местами порядок сравнения предикатов (comparison...) и выражение switch(sysnmbrEq) то думаю, код уменьшится раз в 5. Вообще, исходник необычайно запущенный. Его надо срочно рефакторить или выбросить на свалку. Сопровождать такой сорс просто невозможно.
...
Рейтинг: 0 / 0
множественные switch case
    #36092564
Фотография chans_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря какую цель вы преследуете этим кодом. Если хотите чтоб никто и никогда не смог разобратся в том что вы написали - продолжайте, начало неплохое.
...
Рейтинг: 0 / 0
множественные switch case
    #36093019
Vetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
корявость кода и сам вижу

пришел сюда за советом ибо спросить рядом не у кого

предыдущий пример был неправильным, каждый раз проверяются условия отдельно для каждой отдельной записи sysnmbrEq, viddocEq

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
m1:        for  (FSObject fsobj = cursor.getFirst(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
 
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
 
                     switch  (sysnmbrEq) {
                         case   0 : //все сисномера, что не равены значению
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 : //все сисномера, что равены значению
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 : //все сисномера, что больше значения
                             if  (comparison <=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 : //все сисномера, что меньше значения
                             if  (comparison >=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 : //все сисномера, что больше или равены значению
                             if  (comparison <  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 : //все сисномера, что меньше или равены значению
                             if  (comparison > 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     switch  (viddocEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }

                ...........

                //если документ удовлетворил условия записываем его в список
                rdList.add(fsobj);
          }

to: Blazkowicz


немного изменил код, вынес сравнение значений в отдельный метод
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 private   boolean  mycompare( int  i1,  int  comparison){
         switch  (i1) {
             case   0 : //все сисномера, что не равены значению
                 if  (comparison ==  0 ) {
                     return  true;
                }
                 break ;
             case   1 : //все сисномера, что равены значению
                 if  (comparison !=  0 ) {
                     return  true;
                }
                 break ;
             case   2 : //все сисномера, что больше значения
                 if  (comparison <=  0 ) {
                     return  true;
                }
                 break ;
             case   3 : //все сисномера, что меньше значения
                 if  (comparison >=  0 ) {
                     return  true;
                }
                 break ;
             case   4 : //все сисномера, что больше или равены значению
                 if  (comparison <  0  ) {
                     return  true;
                }
                 break ;
             case   5 : //все сисномера, что меньше или равены значению
                 if  (comparison > 0 ) {
                     return  true;
                }
                 break ;
        }
         return  false;
    }

теперь код стал намного короче

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
m1:        for  (FSObject fsobj = cursor.getFirst(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
                     if (mycompare(sysnmbrEq, comparison)){
                         continue  m1;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     if (mycompare(viddocEq, comparison)){
                         continue  m1;
                    }
                }
                ...........
                //если документ удовлетворил условия записываем его в список
                rdList.add(fsobj);



to забыл ник

как можно избавится от обработки 6 вариантов значений если условие Я получаю из веб формы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    <select id="sysnmbrEq" name="sysnmbrEq">
        <option value=\"1\" selected=\"selected\">=</option>")
        <option value=\"0\">не =</option>");                  
        <option value=\"2\"><</option>");                     
        <option value=\"3\">></option>");                     
        <option value=\"4\"><=</option>");                    
        <option value=\"5\">>=</option>");
    </select>                    

подскажи пжлст как сделать оптимальние

жду критики еще....)))))
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
множественные switch case
    #36093083
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vetic...

Если тело case очень сложное, и есть тенденция к расширению количества вариантов - то используй шаблон Replace Conditional with Polymorphism.

Veticmay way
my way
...
Рейтинг: 0 / 0
множественные switch case
    #36093130
Vetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переписал метод на использование if else

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 private   boolean  mycompare( int  i1,  int  comparison){
         if (i1== 0 ){
             if  (comparison ==  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 1 ){
             if  (comparison !=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 2 ){
             if  (comparison <=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 3 ){
             if  (comparison >=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 4 ){
             if  (comparison <  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 5 ){
             if  (comparison >  0 ) {
                     return  true;
            }
             return  false;
        }
         return   true;
}

только все равно выглядит громоздко и думаю что из-за такого количества if-ов код будет работать медленее

--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
множественные switch case
    #36093153
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Veticпереписал метод на использование if else
только все равно выглядит громоздко и думаю что из-за такого количества if-ов код будет работать медленее
Оператор && вам не знаком в принципе? Для начала запишите эту лесенку ОДНИМ условием. А дальше уже будет видно.
...
Рейтинг: 0 / 0
множественные switch case
    #36093225
Vetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 private   boolean  mycompare( int  i1,  int  comparison){
         if (i1== 0  && comparison ==  0 ){
             return  true;
        } else   if (i1== 1  && comparison !=  0 ){
             return  true;
        } else   if (i1== 2  && comparison <=  0 ){
             return  true;
        } else   if (i1== 3  && comparison >=  0 ){
             return  true;
        } else   if (i1== 4  && comparison <  0 ){
             return  true;
        } else   if (i1== 5  && comparison >  0 ){
             return  true;
        } else  
             return  false;
}
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
множественные switch case
    #36093394
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замечательно! Теперь как на счет ||?
...
Рейтинг: 0 / 0
множественные switch case
    #36093418
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
элементарно :)
...
Рейтинг: 0 / 0
множественные switch case
    #36093431
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
элементарно :)
Код: plaintext
1.
2.
3.
4.
5.
 private   boolean  mycompare( int  i1,  int  comparison){
     return  (i1== 0  && comparison ==  0 ) || (i1== 1  && comparison !=  0 ) 
        || (i1== 2  && comparison <=  0 ) || (i1== 3  && comparison >=  0 ) 
        || (i1== 4  && comparison <  0 ) || (i1== 5  && comparison >  0 )
}
...
Рейтинг: 0 / 0
множественные switch case
    #36093465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобные проверки с comparison я обычно делал с учётом вероятности срабатывания предикатов. Например, если величина равномерноо распылена по диапазону int, то можно проверить сначала comparison>0, потом comparison < 0, а потом проверять нестрогие проверки. Но такая оптимизация была полезна на С++ и на очёнь тяжёлых циклах.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
множественные switch case
    #40003534
ravivc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только прошел материал о том как правильно использовать switch как сразу же наткнулся на этот топик))
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / множественные switch case
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]