我有一个 Card 类,它包含值 (int)、花色 (String) 和 faceValue (String)。似乎 Card.value 上的常规插入排序应该可以正常工作。我只是在移动东西时使用整个对象。出于某种原因,这会崩溃和燃烧。它最终将最高的卡片复制到每个元素中,除了我无法理解的随机元素。
value、suit 和 faceValue 也是公开的。
这是我的代码:
public static void insertionSort(ArrayList<Card> Array) {
int i,j;
Card key = new Card(0, "","");
for (i = 1; i < Array.size(); i++) {
key.value = Array.get(i).value;
key.suit = Array.get(i).suit;
key.faceValue = Array.get(i).faceValue;
j = i;
while((j > 0) && (Array.get(j - 1).value > key.value)) {
Array.set(j,Array.get(j - 1));
j--;
}
Array.set(j,key);
}
}
我对照维基百科的伪代码检查了这个,我找不到任何根本的区别。我已经通过调试器十几次了,我看不出有任何理由让编译器做它正在做的事情。有谁知道为什么它不起作用?
谢谢。
最佳答案
我想扩展 ginz 的回答。
Java 对象通过引用传递。 因此,您正在更改一个对象并将其设置为多个索引。
可视化(之前和之后):
对于之后:请注意并非所有索引都必须引用同一个对象。其中一些可以保持不变。
更好的方法是移动对象,而不是尝试复制它们。
此外,根据 Java 标准,属性(变量)的名称应始终以小写字母开头。
这是工作代码:
public static void insertionSort(ArrayList<Card> array) {
int i, j;
for (i = 1; i < array.size(); i++) {
Card tmp = array.get(i);
j = i;
while ((j > 0) && (array.get(j - 1).value > tmp.value)) {
array.set(j, array.get(j - 1));
j--;
}
array.set(j, tmp);
}
}
关于Java插入排序对象的数组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23503921/