一个简单的解决方案
如果您只需要在 List 的 4 个索引处旋转 1 次元素,则可以编写一个简单的通用方法,如下所示:
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> 的4 个元素。请记住,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]
// * * * *
更通用的解决方案
如果您需要一种方法将任意数量的元素旋转任意距离,然后您可以创建另一个List 的实时视图,然后您可以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]
// * * * * *
由于元素不是连续的,你不能使用subList,但你可以写e.g. PeriodicalLiveViewList 班级。你希望能够写出这样的东西:
System.out.println(PeriodicalLiveViewList.of(list, 3, 2));
// [c, f, i, l]
Collections.rotate(PeriodicalLiveViewList.of(list, 3, 2), 1);
基本上,您创建另一个List,其元素是另一个List 的每个第三个元素,从索引2 开始,作为实时视图。
如果您使用 Guava,您可以在 ForwardingList 上进行构建。如有必要,您也可以从头开始实现decorator pattern。
相关问题