我试图通过学习如何编写算法来利用夏天来练习更多的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);
}
}
}
}
答案 0 :(得分: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);
答案 1 :(得分: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);
请为所有圣洁的人所爱,don't call method from inside a constructor。从构造函数中删除方法调用,并将其移动到main方法,如下所示:
Algorithms algo = new Algorithms();
algo.bubbleSort()