我有一个类Card,其中包含value(int),suit(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);
}
}
我对维基百科的伪代码进行了检查,我找不到任何根本的区别。我已经通过调试器十几次了,我看不出编译器做其正在做的事情的任何理由。有没有人知道它为什么不起作用?
感谢。
答案 0 :(得分:3)
您使用相同的元素设置Array
(OMG,请重命名!)的所有字段:key
。所以,所有元素都是一样的。
答案 1 :(得分:3)
在每个周期,您插入对象&#34; key&#34;进入列表(Array.set(j,key);)。因此,最后您的整个列表将由对象&#34; key&#34;的引用组成。因此,当您在最后设置key.value,key.suit和key.faceValue时,您将设置列表中每个元素的字段,因为您的列表包含同一对象的引用。
移动卡片密钥=新卡片(0,&#34;&#34;,&#34;&#34;);在for循环中。像这样:
public static void insertionSort(ArrayList<Card> Array) {
int i,
j;
for (i = 1; i < Array.size(); i++) {
Card key = new Card(0, "","");
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);
}
}
gl你的学习:)
答案 2 :(得分:2)
我想扩展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);
}
}
答案 3 :(得分:1)
基本算法是
所以,在你的情况下:
public static void insertionSort(ArrayList<Card> cards) {
for (int i = 1; i < cards.size(); i++) {
int value = cards.get(i).value;
j = i;
for (j = i-1; j >= 0; j--) {
if (cards.get(j).value <= key.value) {
break;
}
}
cards.add(j,cards.remove(i));
}
}
这里的一个重点是,数组在任何时候都不包含重复值(当您使用set
时会发生这种情况)
答案 4 :(得分:0)
使用迭代器获取元素。
public static void insertionSort(ArrayList<Integer> arrL) {
Iterator<Integer> it = arrL.iterator();
while(it.hasNext()){
int new_element = it.next();
int j = arrL.indexOf(new_element);
while(j>0 && arrL.get(j-1)>new_element){
arrL.set(j, arrL.get(j-1));
j--;
}
arrL.set(j, new_element);
}
}