在 Java 中使用 Collections.rotate() 向后移动列表中的元素

Move element backward in a List using Collections.rotate() in Java

我有一个如下所述的 ArrayList(我的代码片段)。

我的列表元素最初按此顺序 - ("Periodic", "Multiple", "Single", "Subsequent", "Consecutive") .

在我的列表元素上应用 Collections.rotate() 后,修改后的列表应该如下所示 -

("Periodic", "Subsequent", "Multiple", "Single", "Consecutive")

元素"Subsequent"需要向后移动到List中的第1个索引元素"Multiple",这样第1个索引的元素在旋转后会被下推到第2个索引。

当我尝试使用 Collections.rotate() 时,它抛出异常。

IllegalArgumentException "fromIndex > toIndex".

我研究并理解了错误,toIndex 应该总是大于或等于 fromIndex,但我不太明白如何修改我的代码片段以实现我的需要。

如有任何建议,我们将不胜感激。

是否可以使用 rotate() 方法向后移动列表中的元素?

List<String> list = new ArrayList<String>(Arrays.asList("Periodic", "Multiple", "Single", "Subsequent", "Consecutive"));
       for (int i = 0; i < list.size(); i++) {
            int indexOfSubName = 0;
            int indexOfMultipleName = 0;

            String name = list.get(i);

            if (name.equalsIgnoreCase("Subsequent")) {
                indexOfSubName = list.indexOf(name);

            }

            if (name.equalsIgnoreCase("Multiple")) {
                int indexOfMultipleName = list.indexOf(name);
            }
           Collections.rotate(list.subList(indexOfSubName , indexOfMultipleName ), 1);
        }

两个问题:

  • 您正在尝试将子列表从 3 变为 1,反之亦然。所以你可以检查最小值和最大值,然后尝试获取子列表。
  • 你的子列表调用会给你带来从索引 1 到 n-1 的元素说,即如果你传递 3,你将只得到两个元素,即索引 1 和 2,而不是第三个。有关详细信息,请参阅此 javadoc。你可以这样做:

    List<String> list = new ArrayList<String>(Arrays.asList("Periodic", "Multiple", "Single", "Subsequent", "Consecutive"));
    int indexOfSubName = 0;
    int indexOfMultipleName = 0;
    for (int i = 0; i < list.size(); i++) {
        String name = list.get(i);
        if (name.equalsIgnoreCase("Subsequent")) {
            indexOfSubName = list.indexOf(name);
        }
        if (name.equalsIgnoreCase("Multiple")) {
            indexOfMultipleName = list.indexOf(name);
        }
    }
    int min = Math.min(indexOfMultipleName, indexOfSubName);
    int max = Math.max(indexOfMultipleName, indexOfSubName);
    Collections.rotate(list.subList(min, max+1), 1);
    System.out.println(list);
    

如果你运行这个,你会得到你需要的输出:

[Periodic, Subsequent, Multiple, Single, Consecutive]

Almas 是正确的,但代码可以更简洁一点:

    List<String> list = new ArrayList<String>(Arrays.asList("Periodic", "Multiple", "Single", "Subsequent", "Consecutive"));
    System.out.format("Before: %s%n", list);
    int indexOfSubName = list.indexOf("Subsequent");
    int indexOfMultipleName = list.indexOf("Multiple");
    int min = Math.min(indexOfMultipleName, indexOfSubName);
    int max = Math.max(indexOfMultipleName, indexOfSubName);
    int distance = 1; // Can be 1 or -2
    Collections.rotate(list.subList(min, max + 1), distance);
    System.out.format("After: %s%n", list);

您可以将子列表向前旋转 1 距离或向后旋转 -2 距离以获得相同的效果。