java - 在随机排序的 ArrayList 中将特定元素与其上面的元素交换

标签 java arraylist indexof

我有一个从 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/

相关文章:

android - 如何对ArrayList使用Collectors.toList?

JavaScript - 使用 indexOf() 在字符串中搜索字符

javascript - 在 2 个符号的索引处查找并拆分字符串

java - 它如何返回 NullPointerException?

java - 使用 jdbcTemplate 和 DAO 层在 jUnit 中测试删除方法

java - 在 JavaFX 中使用枚举类填充组合框?

python - 使用类反转 python 中的字符串数组

java - 实现 Iterator 的抽象类的实例不会迭代

android - 将 List<String> 放入 Bundle

jquery - 解析 Twitter 的 JSON 结果时,indexOf 不起作用