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

zmeyuzjn  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(185)

我有一个如下所述的数组列表(我的代码段)。
我的列表元素最初的顺序是- (“周期性”、“多个”、“单个”、“后续”、“连续”)。
在我的List元素上应用**Collections.rotate()**后,修改后的List应该看起来像-

  • (“周期性”、“后续”、“多个”、“单个”、“连续”)*。

元素“后续”需要向后移动到列表中的第一个索引元素“多个”,以便在旋转后将第一个索引处的元素下推到第二个索引。
当我尝试使用**Collections.rotate()**时,它抛出一个Exception。

非法参数异常**“fromIndex〉toIndex”**。

我研究并理解了错误,toIndex应该总是大于或等于fromIndex,但我不太清楚如何修改代码片段以实现我需要的内容。
任何建议将不胜感激。
是否可以使用**rotate()**方法在List中向后移动元素?

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);
        }
jckbn6z7

jckbn6z71#

两个问题:

  • 你正在尝试从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]
n3ipq98p

n3ipq98p2#

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距离以获得相同的效果。

kqlmhetl

kqlmhetl3#

实际上,list在将项目添加到某个索引时会自动执行,而不需要使用rotate:

//                                                                   (.) -----------------> (.)
    List<String> list = new ArrayList<>(Arrays.asList("Periodic", "Multiple", "Single", "Subsequent", "Consecutive"));
    list.remove("Multiple");
    int newPosition = 3;
    list.add(newPosition, "Multiple");
    System.out.println(list);
    //                                                   (.) <------------------ (.)
    list = new ArrayList<>(Arrays.asList("Periodic", "Multiple", "Single", "Subsequent", "Consecutive"));
    list.remove("Subsequent");
    newPosition = 1;
    list.add(newPosition, "Subsequent");
    System.out.println(list);

输出:

[Periodic, Single, Subsequent, Multiple, Consecutive]
[Periodic, Subsequent, Multiple, Single, Consecutive]

相关问题