Java插入使用数组对象列表排序?

时间:2014-05-06 20:03:19

标签: java sorting

我有一个类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);
    }


}

我对维基百科的伪代码进行了检查,我找不到任何根本的区别。我已经通过调试器十几次了,我看不出编译器做其正在做的事情的任何理由。有没有人知道它为什么不起作用?

感谢。

5 个答案:

答案 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对象通过引用传递。 所以你要更改一个对象并将其设置为多个索引。

要想象(之前之后):

visual representation

之后的:请注意,并非所有索引都必须引用同一个对象。其中一些可以保持不变。


更好的方法是移动对象,而不是尝试复制它们。

此外,根据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);
    }
 }