在ArrayList中移动多个项目

时间:2014-12-05 13:53:24

标签: java arraylist

我在ArrayList中有以下数据。为方便起见,我们说它是一个String ArrayList。

Mokey
MokeyBaby1
MokeyBaby2
MokeyBaby3
Dog
DogBaby1
DogBaby2
Cat
CatBaby1

我需要一起移动相关的项目。

例如: Moving Monkey down。新的ArrayList看起来像这样。

Dog
DogBaby1
DogBaby2
Mokey
MokeyBaby1
MokeyBaby2
MokeyBaby3
Cat
CatBaby1

我已经有一个方法可以告诉我哪些ArrayList索引是相关的。

例如:getRelatedIndexes("Monkey")会为原始列表返回0,1,2,3

我只需要知道是否有一种简单的方法可以将所有项目向上或向下移动到一起。

感谢。

4 个答案:

答案 0 :(得分:1)

您可以将列表包装在可重新排序的列表中,并通过该列表实现重新排序 - 至少您不需要破解主列表。它将维持一个int的数组顺序,然后您可以随意移动。如果愿意,您甚至可以在几个不同的订单中维护相同的数据。

public static class OrderedList<T> extends AbstractList<T> {

    // The list I proxy.
    private final List<T> it;
    // The order.
    private final int[] order;

    public OrderedList(List<T> wrap) {
        it = wrap;
        order = new int[it.size()];
        // Initially the same order.
        for (int i = 0; i < order.length; i++) {
            order[i] = i;
        }
    }

    @Override
    public T get(int index) {
        return it.get(order[index]);
    }

    @Override
    public int size() {
        return it.size();
    }

    // TODO - Only moves up! Breaks on a down move.
    public void move(int start, int length, int to) {
        int[] move = new int[length];
        // Copy it out.
        System.arraycopy(order, start, move, 0, length);
        // Shift it down.
        System.arraycopy(order, start + length, order, start, to - start);
        // Pull it back in.
        System.arraycopy(move, 0, order, to, length);

    }
}

public void test() {
    List<String> t = Arrays.asList("Zero", "One", "Two", "Three", "Four", "Five");
    OrderedList<String> ordered = new OrderedList(t);
    System.out.println(ordered);
    ordered.move(1, 2, 3);
    System.out.println(ordered);
}

打印

[Zero, One, Two, Three, Four, Five]
[Zero, Three, Four, One, Two, Five]

或者 - 使用Collections.rotate并找出应该轮换哪个子列表以实现移动。

答案 1 :(得分:0)

也许这包含您需要的解决方案(交换和/或轮播/子列表) - Moving items around in an ArrayList

答案 2 :(得分:0)

可以通过

实现块移位策略
  • 使用List.remove(index)将元素从原始列表中取出并添加到新的临时数组中。请注意,这必须以相反的顺序完成,否则索引将随着项目的删除而改变。
  • 使用List.addAll(index,collection)
  • 将新临时数组添加到所需位置
  • 在其他地方使用时克隆的索引列表

实施例

public static void main(String[] args) {
    List<Animal> animals = new ArrayList<Animal>(Arrays.asList(new Animal(
            "Mokey"), new Animal("MokeyBaby1"), new Animal("MokeyBaby2"),
            new Animal("MokeyBaby3"), new Animal("Dog"), new Animal(
                    "DogBaby1"), new Animal("DogBaby2"), new Animal("Cat"),
            new Animal("CatBaby1")));

    int[] relatedIndexes= { 0, 1, 2, 3 };
    shift(animals, relatedIndexes, 3);

    System.out.println(animals);
}

private static void shift(List<Animal> original, int[] indexes, int newIndex) {
    int[] sorted = indexes.clone();
    Arrays.sort(sorted);
    List<Animal> block = new ArrayList<Animal>();
    for (int i = sorted.length - 1; i >= 0; i--) {
        block.add(original.get(sorted[i]));
        original.remove(i);
    }
    original.addAll(newIndex, block);
}

输出

[Dog, DogBaby1, DogBaby2, Mokey, MokeyBaby1, MokeyBaby2, MokeyBaby3, Cat, CatBaby1]

答案 3 :(得分:0)

您可以搜索列表中的项目,这些项目会满足您的条件并将其安全地保存到另一个临时列表中。然后使用addAll(int index, Collection<? extends E> c)方法将这些元素再次添加到列表中。然后,您不必为每个元素使用add(int index, E element)