在Java中使用Collections.rotate()向后移动列表中的元素
我有一个ArrayList,如下所述(我的代码片段) 我的列表元素最初的顺序是-(“周期性”、“多个”、“单个”、“后续”、“连续”) 在我的列表元素上应用Collections.rotate()后,修改后的列表应该如下所示- (“定期”、“后续”、“多次”、“单一”、“连续”) 元素“后续”需要向后移动到列表中的第一个索引元素,该元素为“多个”,以便在旋转后,第一个索引处的元素将被下推到第二个索引 当我尝试使用Collections.rotate()时,它抛出了一个异常 IllegalArgumentException“从索引>到索引” 我研究并理解了错误,toIndex应该始终大于或等于fromIndex,但我不太明白如何修改代码片段以实现我所需要的 如有任何建议,将不胜感激 是否可以使用rotate()方法在列表中向后移动元素在Java中使用Collections.rotate()向后移动列表中的元素,java,arraylist,collections,Java,Arraylist,Collections,我有一个ArrayList,如下所述(我的代码片段) 我的列表元素最初的顺序是-(“周期性”、“多个”、“单个”、“后续”、“连续”) 在我的列表元素上应用Collections.rotate()后,修改后的列表应该如下所示- (“定期”、“后续”、“多次”、“单一”、“连续”) 元素“后续”需要向后移动到列表中的第一个索引元素,该元素为“多个”,以便在旋转后,第一个索引处的元素将被下推到第二个索引 当我尝试使用Collections.rotate()时,它抛出了一个异常 IllegalArgu
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,向后的距离-1List<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);