0

我正在尝试利用暑假来练习更多的 Java,通过学习如何编写算法来变得更好。我有这个问题,我将元素添加到我的 ArrayList 但不知何故我添加的第一个数字也设置了我想要避免的列表中的位置数。我只希望第 0 个索引包含数字 5。我似乎不知道如何解决这个问题。

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);
        }
    }
}
}
4

2 回答 2

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);
于 2013-09-01T18:44:22.720 回答
1

以下两条语句:

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

不执行交换。该List#set(int, E)方法的第一个参数是列表中的索引,您要在其中设置作为第二个参数传递的值。您需要使用temp变量进行交换。

此外,出于同样的原因,交换不适用于您的评论行。Collections#swap方法采用索引进行交换。因此,只需更改:

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

至:

Collections.swap(numbers, a, b);

并且请为了所有神圣的事物的爱,不要从构造函数内部调用方法。从构造函数内部删除方法调用,并将其移至 main 方法,如下所示:

Algorithms algo = new Algorithms();
algo.bubbleSort()
于 2013-09-01T18:46:49.883 回答