/* * Copyright (c) 2008-2013, 2015, 2016 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.net4j.util.collection; import java.util.ArrayList; /** * A list with O(1) effort for random access. * <p> * Whenever possible EMF's BasicEList should be used in favour of this list implementation. * * @author Eike Stepper */ public class MoveableArrayList<E> extends ArrayList<E> implements MoveableList<E> { private static final long serialVersionUID = 1L; public MoveableArrayList(int initialCapacity) { super(initialCapacity); } /** * @since 3.0 */ public void move(int newPosition, Object object) { move(newPosition, indexOf(object)); } public E move(int targetIndex, int sourceIndex) { int size = size(); if (sourceIndex >= size) { throw new IndexOutOfBoundsException("sourceIndex=" + sourceIndex + ", size=" + size); //$NON-NLS-1$ //$NON-NLS-2$ } if (targetIndex >= size) { throw new IndexOutOfBoundsException("targetIndex=" + targetIndex + ", size=" + size); //$NON-NLS-1$ //$NON-NLS-2$ } E object = get(sourceIndex); if (targetIndex == sourceIndex) { return object; } if (targetIndex < sourceIndex) { moveUp1(targetIndex, sourceIndex - targetIndex); } else { moveDown1(targetIndex, targetIndex - sourceIndex); } set(targetIndex, object); return object; } private void moveUp1(int index, int count) { for (int i = count; i > 0; i--) { set(index + i, get(index + i - 1)); } } private void moveDown1(int index, int count) { for (int i = count; i > 0; i--) { set(index - i, get(index - i + 1)); } } }