想象一下,在Java <1,2,3,4,5>中有一个由索引(1-5)指定的列表。
如果我想将索引2(2)上的项目移到索引4并将列表重新排列为<1、3、4、2、5>。
是否有简单的方法/收集框架来实现? LinkedList似乎是一种解决方案。
答案 0 :(得分:5)
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4));
Collections.swap(list, 1,3); // will swap the elements at the specified positions
如果您只想将元素移动到某个位置,请尝试:
list.add(2, list.remove(0)); // move the item from index 0 to index 2
答案 1 :(得分:1)
由于您不想交换2个项目,而是删除一个项目然后在以后插入它,您可以使用以下方法:
public static <T> void move(List<T> list, int i, int j) {
list.add(j, list.remove(i));
}
这利用了List.add(int, T)
方法和方法List.remove(int)
,该方法将项目插入到特定索引处的列表中,该方法将删除给定索引处的元素并将其返回。
另一种方法是使用Collections.rotate()
和List.sublist()
:
public static <T> void move(List<T> list, int i, int j) {
Collections.rotate(list.sublist(i, j), -1);
}
答案 2 :(得分:0)
您面临的问题之一是,出于实际目的,使用Set会将自己限制为无序的HashSet或有序的TreeSet。当您谈论更改索引时,您暗中在谈论一种不同类型的集合。是的,对于您您指定顺序的集合,列表是一个不错的选择。
此外,请记住,Java中的索引是基于0的,因此一旦按所需顺序列出了List,例如List <1、3、4、2、5>,则1在索引0、2中将会在索引3中,依此类推。