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

在Java中使用Collections.rotate()向后移动列表中的元素,java,arraylist,collections,Java,Arraylist,Collections,我有一个ArrayList,如下所述(我的代码片段) 我的列表元素最初的顺序是-(“周期性”、“多个”、“单个”、“后续”、“连续”) 在我的列表元素上应用Collections.rotate()后,修改后的列表应该如下所示- (“定期”、“后续”、“多次”、“单一”、“连续”) 元素“后续”需要向后移动到列表中的第一个索引元素,该元素为“多个”,以便在旋转后,第一个索引处的元素将被下推到第二个索引 当我尝试使用Collections.rotate()时,它抛出了一个异常 IllegalArgu

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

我的列表元素最初的顺序是-(“周期性”、“多个”、“单个”、“后续”、“连续”)

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

(“定期”、“后续”、“多次”、“单一”、“连续”)

元素“后续”需要向后移动到列表中的第一个索引元素,该元素为“多个”,以便在旋转后,第一个索引处的元素将被下推到第二个索引

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

IllegalArgumentException“从索引>到索引”

我研究并理解了错误,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);
        }
List List=newarraylist(Arrays.asList(“周期”、“多次”、“单一”、“后续”、“连续”));
对于(int i=0;i
两个问题:

  • 您试图将子列表从3变为1,反之亦然。所以您可以检查最小值和最大值,然后尝试获取子列表
  • 您的子列表调用将把元素从索引1带到n-1,也就是说,如果通过3,您将只得到两个元素,即索引1和2,而不是第三个元素。请参阅此以了解详细信息。你可以这样做:

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

    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);
    
    List List=newarraylist(Arrays.asList(“周期”、“多次”、“单一”、“后续”、“连续”));
    System.out.format(“之前:%s%n”,列表);
    int indexOfSubName=list.indexOf(“后续”);
    int indexOfMultipleName=list.indexOf(“多个”);
    int min=Math.min(indexOfMultipleName,indexOfSubName);
    int max=Math.max(indexOfMultipleName,indexOfSubName);
    整数距离=1;//可以是1或-2
    集合.旋转(列表.子列表(最小值,最大值+1),距离);
    系统输出格式(“在:%s%n之后”,列表);
    

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

    您的意思是仅将n-1与第一个元素交换?很抱歉,我编辑了我的问题。我的意思不是将n-1与第一个元素交换,而是将n-1元素移动到第一个索引位置,以便在旋转后第一个索引处的元素将被向下推到第二个索引。完美!非常感谢您提供的有见地的信息。现在工作如预期。只是澄清一下,如果距离为正(1),那么最大+1处的元素将移动到最小右侧?如果距离为负(-1),那么最小值处的元素将移动到最大值+1,对吗?我不太了解rotate()方法的诀窍,如果你能对此有所了解,那将非常有帮助。因此,如果你的元素是a,b,c,如果你的距离是1,那么输出将是c,a,b(右移),而如果是负数,那么它将是左移b,c,a。对我来说,它是向前的距离1,向后的距离-1
        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);