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

时间:2015-01-07 06:26:43

标签: java arraylist collections

我有一个如下所述的ArrayList(My Code Snippet)。

My List元素最初按此顺序排列 - (" Periodic"," Multiple"," Single","后续&#34 ;,"连续")。

在我的List元素上应用 Collections.rotate()后,修改后的List应如下所示:

("定期","后续","多个","单","连续&#34 ;)

元素"后续"需要向后移动到List中的第一个索引元素,即" Multiple",这样第一个索引处的元素将在旋转后被下推到第二个索引。

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

  

IllegalArgumentException " 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);
        }

2 个答案:

答案 0 :(得分:3)

两个问题:

  • 您正试图从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]

答案 1 :(得分:3)

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