2013-09-01 2 views
0

Я пытаюсь использовать лето, чтобы практиковать больше Java, чтобы поправиться, узнав, как кодировать алгоритмы. У меня есть эта проблема, когда я добавляю элементы в свой ArrayList, но каким-то образом первое число, которое я добавляю, также задает количество позиций в моем списке, которые я хочу избежать. Я хочу, чтобы только 0-й индекс содержал число 5. Кажется, я не понимаю, как это решить.Java Bubblesort Algorithm

public class Algorithms { 

private ArrayList<Integer> numbers; 

public Algorithms() { 

    numbers = new ArrayList<Integer>(); 
    numbers.add(5); 
    numbers.add(4); 
    bubblesort(); 
} 

public static void main(String args[]) { 
    new Algorithms(); 
} 

public void bubblesort() { 

    System.out.println(numbers); 
    for (int a = 0; a < numbers.size();) { 
     for (int b = 1; b < numbers.size();) { 
      int currentNumber = numbers.get(a); 
      if (currentNumber > numbers.get(b)) { 

       //Collections.swap(numbers, currentNumber, numbers.get(b)); 

       numbers.set(numbers.get(a), numbers.get(b)); 
       numbers.set(numbers.get(b), numbers.get(a)); 

       a++; 
       b++; 

      } else if (currentNumber < numbers.get(b)) { 
       a++; 
       b++; 
      } 
      System.out.println(numbers); 
     } 
    } 
} 
} 
+0

Что вы думаете 'numbers.set (numbers.get (а), numbers.get (б)),' должен делать? Вы взглянули на API-интерфейс ArrayList? –

ответ

3

Вы не меняете местами элементы правильно. Вместо

numbers.set(numbers.get(a), numbers.get(b)); 
numbers.set(numbers.get(b), numbers.get(a)); 

должно быть

int temp = numbers.get(a); 
numbers.set(a, numbers.get(b)); 
numbers.set(b, temp); 
+0

Правильно, так что теперь все работает, однако, когда я выбираю добавить больше элементов в список, он сортирует i, но за счет indexoutofBounds Exception я знаю, что это связано с временной переменной int currentNumber = numbers.get (a) ; указывая на следующий индекс списка, которого нет. Я не могу найти способ решить эту проблему, если бы вы могли помочь мне найти способ обойти это. – JP24

1

В приведенной ниже двух утверждений:

numbers.set(numbers.get(a), numbers.get(b)); 
numbers.set(numbers.get(b), numbers.get(a)); 

не выполняет замену. Первый аргумент метода - это индекс в списке, где вы хотите установить значение, переданное как 2-й аргумент. Вам нужно использовать переменную temp для замены.

Кроме того, обмен данными не работал для вашей прокомментированной строки по той же причине. Collections#swap метод принимает индексы для подкачки. Так, просто изменить:

Collections.swap(numbers, currentNumber, numbers.get(b)); 

к:

Collections.swap(numbers, a, b); 

И, пожалуйста, за любовь все, что свято, don't call method from inside a constructor. Удалите вызов метода из конструктора, и переместить его в основной метод, как это:

Algorithms algo = new Algorithms(); 
algo.bubbleSort() 
+0

О, так я могу вызвать методы непосредственно из основного метода. Cheers :) – JP24

+0

@ JP24. Конечно. –