一个简单的解决方案
如果只需要在a的4个索引处旋转元素
List
,您只需编写这样一个简单的通用方法:
static <T> void rotate4(List<T> list, int i0, int i1, int i2, int i3) {
T item = list.get(i3);
item = list.set(i0, item);
item = list.set(i1, item);
item = list.set(i2, item);
item = list.set(i3, item);
}
这将循环旋转任意
List<T>
. 记住
List.set
返回以前在该索引处的元素,因此
能够
如果需要,请将整个方法写在一行中:
// one-liner version
list.set(i3, list.set(i2, list.set(i1, list.set(i0, list.get(i3)))));
使用此助手方法,您将拥有:
List<Character> list = Arrays.asList(
'a','b','c','d','e','f','g','h','i','j','k','l'
);
System.out.println(list);
// [a, b, c, d, e, f, g, h, i, j, k, l]
// * * * *
rotate4(list, 2, 5, 8, 11);
System.out.println(list);
// [a, b, l, d, e, c, g, h, f, j, k, i]
// * * * *
更通用的解决方案
如果
您需要一种方法来为任意距离旋转任意数量的元素,然后您可以创建
现场视图
另一个
表
,然后你可以
Collections.rotate
那个观点。
如果
元素是连续的,例如,您只需使用
subList
:
List<Character> list = Arrays.asList(
'a','b','c','d','e','f','g','h','i','j','k','l'
);
System.out.println(list);
// [a, b, c, d, e, f, g, h, i, j, k, l]
// * * * * *
System.out.println(list.subList(1, 6));
// [b, c, d, e, f]
Collections.rotate(list.subList(1, 6), -2);
System.out.println(list);
// [a, d, e, f, b, c, g, h, i, j, k, l]
// * * * * *
由于元素不是连续的,因此不能使用
子列表
但是你可以写例如
PeriodicalLiveViewList
班级。你希望能够写这样的东西:
System.out.println(PeriodicalLiveViewList.of(list, 3, 2));
// [c, f, i, l]
Collections.rotate(PeriodicalLiveViewList.of(list, 3, 2), 1);
基本上你创造了另一个
表
其元素是另一个元素的每三个元素
表
,从索引2开始,作为
现场视图
.
如果你用的是番石榴,有
ForwardingList
你可以建立在上面。您可以实现
decorator pattern
如果有必要,也可以从头开始。
相关问题