首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在随机排序的ArrayList中,用上面的元素交换特定的元素

在随机排序的ArrayList中,用上面的元素交换特定的元素
EN

Stack Overflow用户
提问于 2018-01-12 10:58:48
回答 2查看 70关注 0票数 0

我有一个来自1-9的ArrayList,它是随机排序的,将被表示为三行,例如,如下所示:

代码语言:javascript
复制
6,5,7
4,8,1
9,2,3

应该注意的是,我只使用了一个平面列表,但我打算稍后将其表示为上面所示。

我需要的是始终能够将9元素与上面的元素交换。因此,对于上面的配置,我需要交换9和4,这需要对可能出现9元素的任何顺序进行。

我已经创建了一个开关语句,当用户按下键盘上的键时,应该这样做。所以这个交换的逻辑应该在那个开关的情况下。

我编写了这段代码来尝试实现这个目标,但它并不像预期的那样工作。

代码语言:javascript
复制
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。然而,这段代码并没有完全按照预期工作。而是这样做的:

随机顺序数组列表产生以下结果:

代码语言:javascript
复制
[6,1,8,3,7,**4**,2,5,**9**]

在如上文所述的交换发生之后,ArrayList变成如下:

代码语言:javascript
复制
[6,1,8,3,7,**9**,2,5,**5**] 

打印输出也说明了这一点,这是有用的:

指数为9: 8的索引交换为: 5。正如您所看到的,尽管它确实在正确的位置交换项,但出于某种原因,它将索引5作为要交换的项,而不是索引5的实际值(即4 )。它有时也会运行,没有超出范围的异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-12 11:16:32

使用Collections.swap

你考虑得太过分了。只需使用对您可用的API即可。

代码语言:javascript
复制
int nineIndex = temp.indexOf(9);
int indexToSwapTo =  (nineIndex + 6) % 9;
Collections.swap(temp, nineIndex, indexToSwapTo);

注意,这假设当9位于最上线时,“上方”行是底部一行,就像循环方式一样。

票数 3
EN

Stack Overflow用户

发布于 2018-01-12 11:41:00

首先,Java中的%操作符具有比-更高的优先级,因此您的第4行相当于

int indexToSwapTo = temp.indexOf(9) - 3;

这是可行的,但是o只适用于最后两行。您应该在右手边添加一些括号,以覆盖每一种情况,如:int indexToSwapTo = (temp.indexOf(9) - 3 ) % 9;

其次,您的代码中有一个逻辑错误。特别是,在添加和删除ArrayList条目的第一个代码块中:

代码语言:javascript
复制
temp.remove(nineIndex);
temp.add(nineIndex, indexToSwapTo);

第二行是错误的,因为它尝试插入要与其交换的条目的索引,而不是该条目的值。在您的示例中,程序正确地意识到它需要在索引5和8处交换ArrayList条目。但是,在您的代码中,您告诉程序将5存储在9的位置,而不是让它将索引5的内容存储在9的位置(在本例中,这是ArrayList的第8个条目)。

要修复您的代码,您应该将上面的代码块替换为:

代码语言:javascript
复制
int value_to_be_swapped = temp.get(indexToSwapTo)
temp.remove(nineIndex);
temp.add(nineIndex, value_to_be_swapped);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48224842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档