我有一个来自1-9的ArrayList,它是随机排序的,将被表示为三行,例如,如下所示:
6,5,7
4,8,1
9,2,3应该注意的是,我只使用了一个平面列表,但我打算稍后将其表示为上面所示。
我需要的是始终能够将9元素与上面的元素交换。因此,对于上面的配置,我需要交换9和4,这需要对可能出现9元素的任何顺序进行。
我已经创建了一个开关语句,当用户按下键盘上的键时,应该这样做。所以这个交换的逻辑应该在那个开关的情况下。
我编写了这段代码来尝试实现这个目标,但它并不像预期的那样工作。
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 )。它有时也会运行,没有超出范围的异常。
发布于 2018-01-12 11:16:32
使用Collections.swap
你考虑得太过分了。只需使用对您可用的API即可。
int nineIndex = temp.indexOf(9);
int indexToSwapTo = (nineIndex + 6) % 9;
Collections.swap(temp, nineIndex, indexToSwapTo);注意,这假设当9位于最上线时,“上方”行是底部一行,就像循环方式一样。
发布于 2018-01-12 11:41:00
首先,Java中的%操作符具有比-更高的优先级,因此您的第4行相当于
int indexToSwapTo = temp.indexOf(9) - 3;。
这是可行的,但是o只适用于最后两行。您应该在右手边添加一些括号,以覆盖每一种情况,如:int indexToSwapTo = (temp.indexOf(9) - 3 ) % 9;
其次,您的代码中有一个逻辑错误。特别是,在添加和删除ArrayList条目的第一个代码块中:
temp.remove(nineIndex);
temp.add(nineIndex, indexToSwapTo);第二行是错误的,因为它尝试插入要与其交换的条目的索引,而不是该条目的值。在您的示例中,程序正确地意识到它需要在索引5和8处交换ArrayList条目。但是,在您的代码中,您告诉程序将5存储在9的位置,而不是让它将索引5的内容存储在9的位置(在本例中,这是ArrayList的第8个条目)。
要修复您的代码,您应该将上面的代码块替换为:
int value_to_be_swapped = temp.get(indexToSwapTo)
temp.remove(nineIndex);
temp.add(nineIndex, value_to_be_swapped);https://stackoverflow.com/questions/48224842
复制相似问题