我有一个如下所述的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);
}
答案 0 :(得分:3)
两个问题:
您的子列表调用将为您带来从索引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距离以获得相同的效果。