【问题标题】:ArrayList element swapping not permanentArrayList 元素交换不是永久性的
【发布时间】:2013-12-18 21:18:45
【问题描述】:

我有一个扑克牌数组列表。

private ArrayList<VisibleCard> m_vecCards;

它有一个私有范围,但是在通过以下方式访问其成员时:

public VisibleCard getCard(int n) {
    return this.m_vecCards.get(n);
}

我发现元素没有通过冒泡排序算法排序:

public void sortCards() {
    int swapCounter, nIndex;
    int upperBound = this.m_vecCards.size() - 1;
    while(true) {
        swapCounter = 0;
        for ( nIndex = 0; nIndex < upperBound; nIndex++ ) {
            if ( this.m_vecCards.get(nIndex).getNumericVal() > this.m_vecCards.get(nIndex + 1).getNumericVal() ) {
                Collections.swap(this.m_vecCards, nIndex, nIndex + 1);
                swapCounter++;
            }
        }
        if ( swapCounter == 0 ) {
            for ( nIndex = 0; nIndex < 7; nIndex++ ) {
                Log.d("order", ""+ this.m_vecCards.get(nIndex).getNumericVal());
            }
            return;
        }
    }
}

我有一个日志函数,可以用来测试数字以确保我的数组正在排序,并且数组正在排序,但是结果不是永久的。

12-18 06:51:08.077: D/order(3636): 2
12-18 06:51:08.077: D/order(3636): 4
12-18 06:51:08.077: D/order(3636): 5
12-18 06:51:08.077: D/order(3636): 8
12-18 06:51:08.077: D/order(3636): 8
12-18 06:51:08.077: D/order(3636): 9
12-18 06:51:08.077: D/order(3636): 9
12-18 06:51:08.087: D/order(3636): 1
12-18 06:51:08.087: D/order(3636): 5
12-18 06:51:08.087: D/order(3636): 6
12-18 06:51:08.087: D/order(3636): 8
12-18 06:51:08.087: D/order(3636): 12
12-18 06:51:08.087: D/order(3636): 12
12-18 06:51:08.087: D/order(3636): 13
12-18 06:51:08.087: D/order(3636): 1
12-18 06:51:08.087: D/order(3636): 1
12-18 06:51:08.087: D/order(3636): 2
12-18 06:51:08.087: D/order(3636): 3
12-18 06:51:08.087: D/order(3636): 3
12-18 06:51:08.087: D/order(3636): 10
12-18 06:51:08.087: D/order(3636): 10
12-18 06:51:08.087: D/order(3636): 4
12-18 06:51:08.097: D/order(3636): 6
12-18 06:51:08.097: D/order(3636): 6
12-18 06:51:08.097: D/order(3636): 9
12-18 06:51:08.097: D/order(3636): 10
12-18 06:51:08.097: D/order(3636): 11
12-18 06:51:08.097: D/order(3636): 13

基本上 ArrayList 中的元素并没有像我想要的那样“永久”交换。我无法理解这种现象,因为我发现代码或日志调试没有任何问题。

public void addCard(VisibleCard vc) {
    if ( this.m_humanAgent ) {
        vc.setPosition(-20, (this.m_vecCards.size() * 85) + 100);
        vc.rotate(1.57079633);
        vc.setup();
    }
    this.m_vecCards.add(vc);
    if ( this.m_vecCards.size() == 7 ) {
        this.sortCards();
    }
}

我为每个玩家添加了总共七张卡片,在数组中存在七个元素后,我调用了 sortCards() 方法,但是在输出卡片后,它们没有按应有的顺序出现。

我这样渲染输出:

    for ( int n = 0; n < 7; n++ ) {
        this.m_flushRummy.getPlayer(0).getCard(n).draw(gl, m_bmTextureIds[0]);
    }

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    当然,它的图形显示顺序不正确!这是根本原因:

    vc.setPosition(-20, (this.m_vecCards.size() * 85) + 100);
    

    在对卡片进行排序之前设置卡片的图形位置 :) 然后它们以正确的顺序绘制,但位置不正确。

    【讨论】:

    • lmao,先生,您是个传奇。它只会发生在我身上。计算机科学学位,我还是个白痴!
    • 感谢您的承认 :) 顺便说一句,考虑更改您的设计 - 在集合中包含 VisibleCard 的想法并不好。这应该仅在表示层中单独完成。
    • 我没有预见到使用 ArrayList 或常规数组之间的区别,关键是该结构在 Player 中封装了许多卡片。或者,如果没有集合,代码会膨胀。
    • 我不是那个意思。我的意思是,您可能应该保留 Cards(而不是 VisibleCards)的集合,并且在业务逻辑级别的所有处理(例如排序)之后通过这个视图(GUI)层的集合将显示它。考虑一下如果你想改变显示方式会发生什么——你必须复制和粘贴带有业务逻辑的代码,而不是重复使用它。你陷入了这个愚蠢的错误不是因为你是个白痴:-),而是因为从一开始就糟糕的设计。混合层很容易做到这一点。
    • 所以根本原因是您添加、排序等。VisibleCards 而不是 Cards。
    【解决方案2】:

    这并没有直接回答你的问题,但是你需要自己实现排序算法吗?如果没有,您可以/应该使用Collections.sort(List) 或Collections.sort(List, Comparator) 方法。

    另外,正如汤姆所说,这将比使用冒泡排序快得多。

    【讨论】:

    • 这个。它也会比冒泡排序快很多。
    • 本主题中的冒泡排序算法没有任何问题,它的工作原理如日志所示。问题是在 arraylist 中按索引交换的任何元素都不是永久的。
    【解决方案3】:
    public void sortCards() {
    int swapCounter, nIndex;
    int upperBound = this.m_vecCards.size() - 1;
    while(swapCounter > 0) {
        swapCounter = 0;
        for ( nIndex = 0; nIndex < upperBound; nIndex++ ) {
            if ( this.m_vecCards.get(nIndex).getNumericVal() > this.m_vecCards.get(nIndex + 1).getNumericVal() ) {
                Collections.swap(this.m_vecCards, nIndex, nIndex + 1);
                swapCounter++;
            }
        }
        upperBound--;
     }    
        if ( swapCounter == 0 ) {
            for ( nIndex = 0; nIndex < 7; nIndex++ ) {
                Log.d("order", ""+ this.m_vecCards.get(nIndex).getNumericVal());
            }
            return;
        }
    }
    }
    

    【讨论】:

    • 不能解决问题。冒泡排序算法不存在这个问题,我断定这是java库中的一个错误。
    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 2016-07-07
    • 2012-08-26
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多