在 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 距离以获得相同的效果。
我有一个如下所述的 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 距离以获得相同的效果。