gpt4 book ai didi

java - 移动 2D ArrayList 中的元素

转载 作者:行者123 更新时间:2023-12-01 06:23:47 24 4
gpt4 key购买 nike

我有 2D ArrayList ,其中充满了元素(包含图像等的对象),因此 2D 数组已满。调用删除函数后,我的数组看起来像左侧的图片;在右侧您可以看到所需的结果。有人可以告诉我如何重新组织我的数组吗?如图所示?

the desired result

这个想法是从下到上。如果我找到间隙(间隙意味着我将元素的背景分别设置为 nullimageIcon 设置为 null),我会将其切换为前一个元素。因为我已经切换了它,所以我必须对整个专栏进行切换。问题是,当它们有 2 个或更多间隙时,该算法什么也不做。

    for (int i = 0; i < 10; i++) {

for (int j = 7; j > 0; j--) {
Item currentItem = this.elements.get(j).get(i).getItem();

if (currentItem.getBack().getIcon() == null) {
int count = j;

while (count > 1) {
Position temp = this.elements.get(count).get(i);
Position zero = this.elements.get(count).get(i);
Position previous = this.elements.get(count - 1).get(i);
zero = previous;
previous = temp;

count--;

}

}
}
}

由于我的游戏板面板,数组数据大小限制为 10x8。数组中的项目是无法区分的,它们只是具有不同的背景(JLabel组件的类型)。这些元素必须“从上到下落下”。

PS:我正在创建《 gem 迷阵》的克隆版

shot1

shot2

最佳答案

根据您在图片中显示的内容,您希望该列的元素“落到底部”?如果是这种情况,您可能应该使用常规的 2D 数组而不是 ArrayList,每个都有一个数组,并假设底部已索引 0 - 为什么?因为 ArrayList 没有固定大小,并且您的问题陈述表明您希望容器具有固定大小。解决方案将是(粗略地,因为您只显示了代码的一部分,而不是 SSCCE):

//Item[][] items;
for( Item[] arr : items )
for( int i = arr.length - 2; i >= 0; i-- )
if ( arr[i] == null ) // or arr[i].getBack().getIcon() == null or whatever
for( int j = i; j < arr.length - 1; j++ )
arr[j] = arr[j+1];

这是一种粗略的冒泡排序,适合小型数组。还有其他可能的解决方案(因为这本身就是一个排序问题 - 您可以查找 qsort 来解决这个问题),但这一个可以说是最简单的。

注意:您可以为 ArrayList 实现完全相同的解决方案,但我强烈反对它。使用嵌套的 ArrayList 来模拟多维数组很少是一个好主意 - 无论如何它都会创建数组,但你会得到很大的开销,使代码变得更慢且可读性更差 - 无论如何您可以通过将 [] 替换为 get()/set() 等来实现。

仅供引用:

//ArrayList<ArrayList<Item>> items;
//int columnHeight;
for( ArrayList<Item> arr : items )
for( int i = columnHeight - 2; i >= 0; i-- )
if ( arr.get(i) == null ) //or arr.get(i).getIcon()==null or whatever
for( int j = i; j < columnHeight - 1; j++ )
arr.set(j, arr.get(j+1));

或者简单地,通过提供一个比较器:

//ArrayList<ArrayList<Item>> items;
//int columnHeight;
for( ArrayList<Item> arr : items )
Collections.sort(arr, new Comparator<Item>() {
@Override
public int compare(Item i1, Item i2) {
return ...; // place the sorting rule here
}
});

有关详细信息,请参阅 Collections.sort() 的文档& Comparator .

此外,如果这确实适用于《 gem 迷阵》克隆 - 您可以考虑通过进行一次迭代来进行“掉落”,将所有珠宝放置在一步中,并计算掉落的珠宝数量,并重复此迭代,直到掉落量 == 0。这是我过去在克隆中使用的算法。

关于java - 移动 2D ArrayList 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com