根据指定的距离轮换指定列表中的元素。调用此方法后,对于 0 和 list.size()-1(包括)之间的所有 i 值,索引 i 处的元素将是以前位于索引 (i - distance) mod list.size() 处的元素。(此方法对列表的大小没有任何影响。)
例如,假设 list 包含 [t, a, n, k, s]。在调用 collections.rotate(list, 1)(或 collections.rotate(list, -4))之后,list 将包含 [s, t, a, n, k]。
注意,此方法用于子列表时非常有用,可以在保留其余元素顺序的同时,在列表中移动一个或多个元素。例如,以下语句可以将索引 j 处的元素向前移动到位置 k 上(k 必须大于等于 j):
collections.rotate(list.sublist(j, k+1), -1);
为了具体说明这一点,假设 list 包含 [a, b, c, d, e]。要将索引 1 处的元素(b)向前移动两个位置,请执行以下调用:
collections.rotate(l.sublist(1, 4), -1);
得到的列表是 [a, c, d, b, e]。
要将多个元素向前移动,则需要增加循环移动距离的绝对值。要将元素向后移动,请使用一个正的移动距离。
如果指定列表是一个小型列表,或者它实现了 randomaccess
接口,则此实现会将第一个元素交换到它应该去的位置上,然后重复执行交换操作,将替换的元素交换到它们应该去的位置上,直到替换的元素交换成第一个元素。如有必要,需要在第二个或后续元素上重复这个过程,直到完成轮换。如果指定的列表是大型列表并且没有实现 randomaccess 接口,则此实现会将列表拆分成位于 -distance mod size 索引两边的两个子列表视图。然后在每个子列表视图上调用 reverse(list)
方法,并最终在整个列表上调用此方法。有关这两种算法更为完整的描述,请参阅 jon bentley 撰写的 programming pearls (addison-wesley, 1986) 一书中的第 2.3 小节。
- 参数:
list
- 要轮换的列表。distance
- 列表轮换的距离。在此值上没有任何限制;它可以是 0、负数或大于 list.size() 的数。
- 抛出:
unsupportedoperationexception
- 如果指定列表或其列表迭代器不支持 set 操作。- 从以下版本开始:
- 1.4