除了元素之外如何重排列表?

Cau*_*ien 6 java shuffle

我有一个带有值元素的列表整数:0,7,2,1,6,5.

我知道我可以使用方法

Collections.shuffle(list);
Run Code Online (Sandbox Code Playgroud)

洗牌我的清单.但我不想改变第二名的价值.它应该总是7.

我怎样才能做到这一点 ?

Era*_*ran 9

您可以随机播放Collection,然后将7恢复到第2个位置:

Collections.shuffle(list);
list.set(list.indexOf(7),list.get(2));
list.set(2,7);
Run Code Online (Sandbox Code Playgroud)

或更短:

Collections.shuffle(list);
Collections.swap(list, 2, list.indexOf(7));
Run Code Online (Sandbox Code Playgroud)

正如其他人建议的那样,您也可以在重排之前删除要保留其位置的元素,然后将其添加到同一位置.

两种方式都应该花费相似的时间用于ArrayLists(在最坏的情况下是线性的),因为在我的回答中indexOf需要线性时间,但在替代解决方案中删除和添加元素(特别是如果索引接近列表的开头)将需要线性时间ArrayList,因为必须将删除/添加的索引之后的所有元素推送到新索引.

  • 如果您不知道元素的值并且只想在第二个位置保留它,您可以在移动之前将其删除,然后将其添加到第二个位置. (2认同)

Psh*_*emo 6

轻松防止简单地移动任意数量的元素

  • 从列表中删除它们,
  • 洗掉剩下的元素,
  • 将它们放回原位(从左侧开始以避免元素向右移动的问题).