2015-03-01 5 views
-1

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

if (radioButAscending.isSelected()){ //ascending order 
      for(int i=0;i<numbers.size()-1;i++){ 
       int minNum=i; 

       for (int j=i+1;j<numbers.size();j++){ 
        if(numbers.get(j)<numbers.get(minNum)){ 
         tempNum=numbers.get(i); 
         numbers.set(i,numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j)) 
         numbers.set(j,tempNum); //numbers.get(j)=tempNum 
        } 
       } 
      } 
      showSortedNumbers(); 
     } else { //descending order 
      for(int i=0;i<numbers.size()-1;i++){ 
       int minNum=i; 
       for (int j=i+1;j<numbers.size();j++){ 
        if(numbers.get(j)>numbers.get(minNum)){ 
         tempNum=numbers.get(i); 
         numbers.set(i,numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j)) 
         numbers.set(j,tempNum); //numbers.get(j)=tempNum 
        } 
       } 
      } 
      showSortedNumbers(); 
     } 

это мои коды, и, как вы видите, коды очень похожи, кроме этих кодов; if(numbers.get(j)<numbers.get(minNum)){ if(numbers.get(j)>numbers.get(minNum)){

так что мой вопрос ... как я могу сделать это короче? Я попытался сделать подпрограмму, но знак был другим, поэтому я не мог этого сделать. Пожалуйста, помогите ребятам. Спасибо большое! :)

+0

отсортировать одну или другую, и использовать некоторую форму обратной() –

ответ

0

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

Во-первых, единственная разница между этими двумя кодовыми блоками - это самая внутренняя заявка if; один сравнивает <, а другой сравнивает >. Все остальное они делают одно и то же.

Этот конкретный код изолирует условное поведение и уменьшает повторение всех операторов цикла.

boolean ascendingOrder = radioButAscending.isSelected(); 
for (int i = 0; i < numbers.size() - 1; i++) { 
    int minNum = i; 

    for (int j = i + 1; j < numbers.size(); j++) { 
     if (ascendingOrder) { 
      if (numbers.get(j) < numbers.get(minNum)) { 
       tempNum = numbers.get(i); 
       numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j)) 
       numbers.set(j, tempNum); //numbers.get(j)=tempNum 
      } 
     } else { 
      if (numbers.get(j) > numbers.get(minNum)) { 
       tempNum = numbers.get(i); 
       numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j)) 
       numbers.set(j, tempNum); //numbers.get(j)=tempNum 
      } 
     } 
    } 
} 
showSortedNumbers(); 

Можем ли мы сделать лучше? Абсолютно!

Мы определяем новый метод compare, который принимает два аргумента из коллекции и выполняет операцию сравнения для нас. Он в основном берет на себя ответственность логической логики в этом методе.

private <T extends Comparable<T>> boolean compare(T left, T right, boolean isAscending) { 
    return isAscending ? 
      left.compareTo(right) <= 0 : 
      right.compareTo(left) <= 0; 
} 

Если мы восходящий, то мы сравниваем левое значение правильного значения, чтобы увидеть, если она меньше (4 и 17; 4 меньше 17). Если мы спускаемся, мы сравниваем противоположный путь (4 и 17; 17 больше 4).

Это уменьшает блок кода следующим образом:

boolean ascendingOrder = radioButAscending.isSelected(); 
for (int i = 0; i < numbers.size() - 1; i++) { 
    int minNum = i; 

    for (int j = i + 1; j < numbers.size(); j++) { 
     if (compare(numbers.get(j), numbers.get(minNum), ascendingOrder)) { 
      tempNum = numbers.get(i); 
      numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j)) 
      numbers.set(j, tempNum); //numbers.get(j)=tempNum 
     } 
    } 
} 
showSortedNumbers(); 
+0

спасибо так много! работает отлично и очень легко понять! Будьте здоровы :) –

0
if (ascending) 
    Collections.sort(numbers); 
else 
    Collections.sort(numbers, Collections.reverseOrder()); 
0

Если Java 8:

Collections.sort(numbers, 
    radioButAscending.isSelected() ? 
     Comparator.naturalOrder() : Comparator.reverseOrder()); 
showSortedNumbers(); 
Смежные вопросы