2013-05-06 3 views
0

У меня есть два списка: list1, list2. Я просматриваю два списка и объединяю их в один список. Затем я использую такое заявление:или оптимизация операторов в android

if(list1 != null && list2 != null) 
{ 
    int i=0,j=0;  
while(i<list1.size() || j<list2.size()) 
{ 

if((j>=list2.size()) || (curFormater.parse(list1.get(i).RecordDate).compareTo(curFormater.parse(list2.get(j).RecordDate)) < 0))    { 
    .....     
i++;  

    } 
    else if((i>=list1.size()) || (curFormater.parse(list1.get(i).RecordDate).compareTo(curFormater.parse(list2.get(j).RecordDate)) < 0)) 
    { 
    ..... 


j++; 

} 


.... 

    } 

в этих двух if-заявления, когда j>=list2.size() или i>=list1.size(), последнее условие не следует судить, но JAVA компилятор, кажется, все судить их и бросить IndexOutOfBoundsExceptio п. Как я могу позволить java не вызывать последнее условие суждения? Спасибо заранее!

+0

Хорошо, я бы сначала работал над читабельностью вашего кода ... – RvdK

ответ

0

Если вы хотите объединить два списка с разным размером, индекс для наименьшего списка всегда будет заканчивать итерацию раньше, чем самый большой список, поэтому вам нужно использовать оператор &&.

if(list1 != null && list2 != null) 
{ 
    int i=0,j=0;  
    while(i<list1.size() && j<list2.size()) 
    { 
     // your code 
     i++; 
     j++; 
    } 
    // when one of them arrived to end of list to loop will not be executed so you need to check 
    // those conditions 
while (i > list.size() && j < list.size()) 
{ 
     // your code 
     j++; 
} 
while (i < list.size() && j > list.size()) 
{ 
     // your code 
     i++; 
} 

поэтому для оптимизации, сложность времени всегда будет O (т + п), если предположить, что существует m элементов list1 и n элементы list2, только два, пока петли будут выполнены

Редактировать

OR и AND операторы Binary Operators, что означает, что они должны проверить два условия, что они сочетают, в то время как Not является Unary, который нуждается в одном условии для проверки.
Если вы слышали о таблицах прав этих операторов, поэтому компиляторы запрограммированы на работу на основе этих таблиц истинности, когда он увидит || (или оператора) он проверяет условия с таблицей истинности OR, когда он видит & & (и оператор), он проверяет условия с таблицей истинности AND. И поскольку оба OR и AND являются бинарными операторами, оба условия будут «оценены» даже , одно из них истинно.

ИЛИ Таблица Правда

(предположим, что A и B являются statemnts (условия) и R является результатом , когда вы делаете или на их

------------------------- 
    A | B | R 
------------------------- 
    True | True | True 
------------------------- 
    True | False | True 
------------------------- 
    False| True | True 
------------------------- 
    False| False | False 
------------------------- 
// so in Or table, when both of the conditions are false the result is False 
// while when one of them is true the result is True 

и истина Таблица

(предположим, что A и B являются statemnts (условия), а R - результатом , когда вы делаете и на них

------------------------- 
    A | B | R 
------------------------- 
    True | True | True 
------------------------- 
    True | False | False 
------------------------- 
    False| True | False 
------------------------- 
    False| False | False 
------------------------- 
// so in And table, when both of the conditions are true the result is True 
// while when one of them is false the result is False 

Я надеюсь, теперь вы понимаете, почему эти два условия должны быть проверены, даже если один из них верно .. Например, предположим, что у вас есть два условия А и В, и вы делаете или на них, и предположим, А ложно

if (A || B) 
// some code here 

в этом случае зависит в состоянии B, если B ложно код не будет выполняться, если B верно, то код будет выполняться ..

Я знаю, что ты спросил почему, если A истинно, это все еще проверка g условие B, так что потому, что , что OR является двоичным оператором.

+0

Другие способы сделать то же самое слияние - это еще один вопрос. что меня смущает, почему в или-заявлении последнее условие все еще судится, пока первое условие верно. Не могли бы вы рассказать мне причину? Спасибо заранее! – user2354292

+0

@ user2354292 см. Мое редактирование – Elior

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