2013-10-07 5 views
8

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

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

public class StringSort { 
    public static void main(String[] args) { 
     String[] arr = new String[] { "abcd", "dexter", "stringsortexample", "fruit", "apple","car" };    
     compareArrayElements(arr);  

     System.out.println("The strings in the sorted order of length are: "); 
     for (String sortedArray : arr) { 
      System.out.println(sortedArray); 
     } 
    } 

    public static void compareArrayElements(String[] arr) { 
     String temp = ""; 
     for (int i = 0; i < arr.length - 1; i++) { 
      for (int j = i+1; j < arr.length; j++) { 
       if (arr[i].length() > arr[j].length()) 
       { 
        temp = arr[i]; 
        arr[i] = arr[j]; 
        arr[j] = temp; 
       } 
      } 
     }  
    } 
} 
+2

«Какая необходимость использовать третью переменную для обмена номерами?» потому что вообще невозможно было бы иначе! –

+0

Хорошо согласен. В приведенном выше примере, что происходит на самом деле? Можете ли вы объяснить в коде, зачем он нужен? –

+1

@ MitchWheat- Вы можете поменять местами без использования третьей переменной. – SudoRahul

ответ

23

Короткий ответ заключается в том, что вы не можете манипулировать Java!

Думайте о каждой переменной как о руке, которая может «удерживать» одно значение; например мяч.

Если у вас есть две руки и два шара, единственный способ переключить шары на противоположные руки - это выбрасывать один из шаров в воздух (или что-то в этом роде). Но в Java нет операции «выбросить значение в воздух».

Если вы не можете манипулировать, вам нужна третья рука (или какое-то другое временное место для удержания) для замены шаров. А в терминах Java это означает временную переменную.

Для записи я нашел эту аналогию очень полезной, когда учился программировать. Но не заходите слишком далеко :-).


(В самом деле, если мы говорим о целых числах, есть математический трюк, который вы можете использовать, чтобы поменять номера ... с участием XOR ... но она не работает вообще.)

+0

Спасибо за отличное объяснение Стивен С. –

6
temp = arr[i]; 
arr[i] = arr[j]; 
arr[j] = temp; 

Это часть замены. Без временной временной переменной вы потеряете информацию на ходу.

Пример: int a = 5, b = 10;

Теперь обменивайте a и b без темпа: a = b; -> a = 10, b = 10 -> 5 не теряется, чтобы получить или получить его. Или попробуем: b = a; -> a = 5, b = 5 -> 10 теряется, и нет способа получить его.

С TEMP:

  • Темп = а; -> a = 5, b = 10, temp = 5.
  • a = b; -> a = 10, b = 10, temp = 5.
  • b = temp; -> a = 10, b = 5, temp = 5.
  • a и b теперь заменены.

Всё. Временная переменная сохраняет исходное состояние одной переменной, так как это состояние становится переопределенным и теряется, когда переменной присваивается новое состояние (или значение).

В вашем примере вы используете swapping для изменения положения номера (информации) с помощью другого места. Здесь у вас есть алгоритм сортировки, который относится к категории Selection Sort (а не bubble sort, как и другие ответы).

Посмотрите анимированное изображение на ссылке «Сортировка пузырьков», и вы получите представление об обмене, а затем взгляните на ссылку «Сортировка», чтобы понять, что здесь происходит.

В вашем примере кода алгоритм проверяет первую позицию и сравнивает ее с любой другой позицией в массиве. Если он обнаружил меньшее значение как текущее в первой позиции, он меняет оба числа. После одной итерации внешнего цикла (внутренний цикл был выполнен полностью в первый раз) первая позиция в вашем массиве содержит наименьшее значение во всем массиве, поскольку, если бы оно было больше, оно было заменено более маленьким, и если вы проверили все значения на нем содержат наименьший.

В следующем прогоне (i = 0 ++ = 1) в цикле остальная часть массива (i + 1 = 2) проверяется на вторую позицию (i = 1). Поэтому после второго итерационного индекса 1 (arr 1) содержит второе наименьшее число (а индекс 0, arry [0] содержит наименьшее число). Это делается до тех пор, пока все индексы массива не будут обработаны таким образом - фактически последний не может быть проверен другими, поскольку он действительно является последним, и в результате массив сортируется.

0

Третья переменная для временного хранения значение, которое вы хотите поменять, в случае целого числа, вы можете сделать это без использования третьей переменной некоторым математическим расчетом, как а = а + b- (Ь = а) ;, Кстати, вышеприведенный код никогда не будет сортировать строковый массив.

+0

Предположим, что A = 5 и b = 10; поэтому вы можете сделать это как a = a + b- (b = a); в случае целого или двойного, но в строке java никогда не будет добавлять или минус строку, но будет ее конкатенировать, кроме этого, в java вы не можете сравнивать a == b где a = "abc" и b = "bc" ; – HEAT

0

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

Третья переменная необходима, потому что вам необходимо временно сохранить одну переменную. Если вы делаете arr[i] = arr[j], вы переопределяете содержимое arr[i] с содержанием arr[j], чтобы потерять это значение, если вы его не сохранили.

(Вы можете значения замены без использования третьей переменной, делая так называемый XOR swap, который включает в себя некоторые битную мастерить.)

4

Кусок кода у вас здесь хорошо известно bubble-sort. Это алгоритм, используемый для сортировки значений массива/списка. Этот алгоритм сравнивает каждую пару смежных переменных и свопит их, если они находятся в неправильном порядке. В статье есть небольшая анимированная картина, которая поможет вам понять, что такое обмен, взглянуть на нее.
В python, к примеру, вы можете сделать обмен двух переменных без использования временной переменной, например, так:

a, b = 1, 2 
a, b = b, a # b is 1 and a is 2 now 

Но в Java и других языков с C-подобным синтаксисом, что я знаю (C , C++, C#), если вы хотите поменять местами две переменные, вам нужно сохранить значение первой переменной во временной переменной, присвоить значение второй переменной первой переменной и затем назначить сохраненную во временном значении переменной (которая была в факт, значение первой переменной) ко второй переменной. Вот как это работает.

+0

OT: если вы используете BubbleSort (когда-либо), вы получаете особое место в программисте ад! ;) –

+0

Это не сортировка пузырьков, это форма выбора, но очень неэффективная с точки зрения обмена. Хороший способ держать стартеры мышления. Престижность для парня, выполняющего урок. –

+0

Хорошо, большое вам спасибо. –

-1

Это зависит от вас ... Как вы хотите использовать его. Как, например, решение одновременного уравнения имеет множество методов для решения, поэтому так же существует множество логических функций, которые можно реализовать, и вы можете выбрать все, что вы хотели бы ...

и насколько это один интерес, я считаю, с помощью третьей переменной здесь будет удалить сложность и улучшить читаемость и понимание ..

1

Давайте просто сказать, что вы пытались поменять без использования третьей переменной.

arr[i] = arr[j]; 
arr[j] = arr[i]; 

Здесь есть очевидная проблема. Поскольку вы назначили arr [j] на arr [i] и наоборот, они равны друг другу. Третья переменная гарантирует, что вы временно сохраните содержимое переменной, которую вы перезаписываете, а затем вы можете назначить ее другой переменной.

1

Пусть a=1, b=2, c;

c=a; средства c=1;

a пустой. a=b; средства a=2;

b пустой. b=c; означает b=1;

вы можете увидеть значения a и b заменены.

2
temp = arr[i];    
arr[i]= arr[j];    
arr[j]= temp; 

вы только что предполагаю обр [я] = 5; arr [j] = 6; , если вы попытаетесь обменять с переменной temp. Затем вы потеряете данные, такие как arr [i] = arr [j]; // arr [i] = 5 и arr [j] = 5 arr [j] = arr [i]; // у обоих есть vale 5. Я думаю, что вы понимаете идею переменной темпа

0

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

без использования 3-й переменной

int a = 10; 
int b = 20; 

a = a + b; 
b = a - b; 
a = a - b; 
1

Третья переменная поможет вам на перекачку 2 значения, особенно на струнах.

Step 1: Move first value to temp (third variable in your case); 
step 2: Move second value to first variable. 
step 3: Move temp value to first variable. 

В ряде случаев вы можете найти код несколько раз без какой-либо третьей переменной. В таких случаях он работает следующим образом:

for (int i=0;i<a.length; i++) { 
    for (int j = i+1; j < a.length; j++) { 
     if (a[i]>a[j]){ 
      a[i] = a[i]+a[j]; 
      a[j]= a[i]-a[j]; 
      a[i]= a[i]-a[j]; 
     } 
    } 
} 

Здесь нет никакой необходимости в третьей переменной.

0

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

Аналогия неточна. Было бы более точно, если бы первый автомобиль клонировал себя в парковочное место, затем вторая машина проехала над первым автомобилем, уничтожив его, а затем клоун первого автомобиля взлетел.

(Или, еще точнее:

  1. Первых автомобильные клоны себя в место для парковки
  2. Второго автомобиля самих клонов в котором оригинал первого автомобиля, разрушая его
  3. клона первый автомобиль клонирует себя туда, где оригинал второй машины, разрушая ее .. и теперь две машины поменялись местами.

Err, неважно, давайте отказываться от точности ради f простота.)

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