是否有java linkedlist方法用作环列表?

xj3cbfub  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(284)

如果我有linkedlist:

Value A B C D E F
Index 0 1 2 3 4 5

我想对列表或迭代器重新排序,例如在d(索引3)处,作为新的头,但保持如下顺序:

Value D E F A B C
Index 0 1 2 3 4 5

这是一个功能,可以实现与linkedlist的开箱即用,基本上实现了一个环?是否有其他类已经实现了这个功能?

yqlxgs2m

yqlxgs2m1#

不,这不可能使用java中的任何标准类。您必须基于任何有序随机访问集合(如:数组、列表)创建自己的实现。
下面的解决方案可能不是最优的,但它是有效的,而且是在5分钟内编写的。

public static void main(String... args) throws IOException {
    Deque<Character> deque = new LinkedList<>();
    deque.addAll(Arrays.asList('A', 'B', 'C', 'D', 'E', 'F'));
    System.out.println(deque);
    reorder(deque, 3);
    System.out.println(deque);
    reorder(deque, 3);
}

public static void reorder(Deque<Character> deque, int offs) {
    offs %= deque.size();

    for (int i = 0; i < offs; i++)
        deque.add(deque.removeFirst());
}

输出:

[A, B, C, D, E, F]
[D, E, F, A, B, C]

p、 正如你所看到的,这种方法是被接受的 Deque ,因此可以使用此接口的任何实现。

6ljaweal

6ljaweal2#

你可以用 Collections.rotate 对于实现 List 接口:

List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
Collections.rotate(list, 3);
System.out.println(list);

输出: [D, E, F, A, B, C]

qmb5sa22

qmb5sa223#

这里有一个非常简单的方法 List::subList(int fromIndex, int toIndex) :

List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");

int index = list.indexOf("D"); // or a fixed number, depends on your implementation

List<String> newList = new ArrayList<>();
newList.addAll(list.subList(index, list.size()));  // right part [D, E, F] first
newList.addAll(list.subList(0, index));            // left part [A, B, C] then

这个 newList 将包含 [D, E, F, A, B, C] 然而,它并没有利用连接结构的任何优点。

相关问题