我有一个从 1 到 9 的 ArrayList,它是随机排序的,并将以三行表示,例如如下顺序:
6,5,7
4,8,1
9,2,3
应该指出的是,我只使用一个平面列表,但我打算稍后像上面那样表示它。
我需要的是能够始终将 9 元素与其上面的元素交换。因此,对于上面的配置,我需要交换 9 和 4。对于 9 元素可能出现的任何顺序都需要执行此操作。
我已经创建了一个 switch 语句,当用户按下键盘上的某个键时,该语句应该执行此操作。所以这个交换的逻辑应该在那个 switch 情况下。
我编写此代码是为了尝试实现此目标,但它没有按预期工作。
case 'u' :
int nineIndex = temp.indexOf(9);
int nine = 9;
int indexToSwapTo = temp.indexOf(9) - 3 % 9;
System.out.println("index of 9: " + nineIndex);
System.out.println("index to swap to : " + indexToSwapTo);
temp.remove(nineIndex);
temp.add(nineIndex, indexToSwapTo);
temp.remove(indexToSwapTo);
temp.add(indexToSwapTo, nine);
break;
这个想法是,我首先获取 9 的索引,然后为了获取其上方项目的索引,我在 9 - 3 处执行索引。然后执行一些添加和删除操作。我还应该注意,temp
是一个保存数字随机配置的 ArrayList。然而这段代码并不能完全按照预期工作。它这样做是这样的:
随机排序的数组列表产生以下结果:
[6,1,8,3,7,**4**,2,5,**9**]
如上所述发生交换后,ArrayList 变成这样:
[6,1,8,3,7,**9**,2,5,**5**]
打印输出也说明了这一点,这很有用:
索引 9:8 索引交换为:5。正如您所看到的,虽然它确实将项目交换到正确的位置,但出于某种原因,它会将索引 5 作为要交换的项目,而不是索引 5 的实际值(即 4)。它有时也会出现越界异常。
最佳答案
使用Collections.swap
你想太多了。只需使用您可用的 API。
int nineIndex = temp.indexOf(9);
int indexToSwapTo = (nineIndex + 6) % 9;
Collections.swap(temp, nineIndex, indexToSwapTo);
请注意,这假设当 9 位于顶行时,“上方”行是底行,就像循环方式一样。
关于java - 在随机排序的 ArrayList 中将特定元素与其上面的元素交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48224842/