Helper method for when moving stuff about in an array, plus test

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@418607 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2006-07-02 15:21:12 +00:00
parent 5db03f2cb0
commit 557b4bb4fa
2 changed files with 348 additions and 1 deletions

View File

@ -47,5 +47,61 @@ public class ArrayUtil
System.arraycopy( src, src_position, dst, dst_position, length);
}
/**
* Moves a number of entries in an array to another point in the array,
* shifting those inbetween as required.
* @param array The array to alter
* @param moveFrom The (0 based) index of the first entry to move
* @param moveTo The (0 based) index of the positition to move to
* @param numToMove The number of entries to move
*/
public static void arrayMoveWithin(Object[] array, int moveFrom, int moveTo, int numToMove) {
// If we're not asked to do anything, return now
if(numToMove <= 0) { return; }
if(moveFrom == moveTo) { return; }
// Check that the values supplied are valid
if(moveFrom < 0 || moveFrom >= array.length) {
throw new IllegalArgumentException("The moveFrom must be a valid array index");
}
if(moveTo < 0 || moveTo >= array.length) {
throw new IllegalArgumentException("The moveTo must be a valid array index");
}
if(moveFrom+numToMove > array.length) {
throw new IllegalArgumentException("Asked to move more entries than the array has");
}
if(moveTo+numToMove > array.length) {
throw new IllegalArgumentException("Asked to move to a position that doesn't have enough space");
}
// Grab the bit to move
Object[] toMove = new Object[numToMove];
System.arraycopy(array, moveFrom, toMove, 0, numToMove);
// Grab the bit to be shifted
Object[] toShift;
int shiftTo;
if(moveFrom > moveTo) {
// Moving to an earlier point in the array
// Grab everything between the two points
toShift = new Object[(moveFrom-moveTo)];
System.arraycopy(array, moveTo, toShift, 0, toShift.length);
shiftTo = moveTo + numToMove;
} else {
// Moving to a later point in the array
// Grab everything from after the toMove block, to the new point
toShift = new Object[(moveTo-moveFrom)];
System.arraycopy(array, moveFrom+numToMove, toShift, 0, toShift.length);
shiftTo = moveFrom;
}
// Copy the moved block to its new location
System.arraycopy(toMove, 0, array, moveTo, toMove.length);
// And copy the shifted block to the shifted location
System.arraycopy(toShift, 0, array, shiftTo, toShift.length);
// We're done - array will now have everything moved as required
}
}

View File

@ -0,0 +1,291 @@
/* ====================================================================
Copyright 2002-2004 Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.util;
import junit.framework.*;
/**
* Unit test for ArrayUtil
*
* @author Nick Burch
*/
public class TestArrayUtil extends TestCase
{
/**
* Test to ensure that our own arraycopy behaves as it should do
*/
public void testarraycopy() {
byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x04 };
// Test copy whole thing
byte[] dest = new byte[4];
ArrayUtil.arraycopy(bytes, 0, dest, 0, 4);
assertEquals(dest.length, bytes.length);
for(int i=0; i<dest.length; i++) {
assertEquals(bytes[i], dest[i]);
}
// ToDo - test exceptions are as expected
}
/**
* Helper for testArrayMoveWithin
*/
private Integer[] getIntsList() {
return new Integer[] {
new Integer(0),
new Integer(1),
new Integer(2),
new Integer(3),
new Integer(4),
new Integer(5),
new Integer(6),
new Integer(7),
new Integer(8),
new Integer(9)
};
}
/**
* Test to ensure that arrayMoveWithin works as expected
*/
public void testArrayMoveWithin() {
Integer[] ints = getIntsList();
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(2), ints[2]);
assertEquals(new Integer(3), ints[3]);
assertEquals(new Integer(4), ints[4]);
assertEquals(new Integer(5), ints[5]);
assertEquals(new Integer(6), ints[6]);
assertEquals(new Integer(7), ints[7]);
assertEquals(new Integer(8), ints[8]);
assertEquals(new Integer(9), ints[9]);
//
// Moving to a later point in the array
//
// Shift 1 back
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 4, 8, 1);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(2), ints[2]);
assertEquals(new Integer(3), ints[3]);
assertEquals(new Integer(5), ints[4]);
assertEquals(new Integer(6), ints[5]);
assertEquals(new Integer(7), ints[6]);
assertEquals(new Integer(8), ints[7]);
assertEquals(new Integer(4), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift front 1 back
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 0, 7, 1);
assertEquals(new Integer(1), ints[0]);
assertEquals(new Integer(2), ints[1]);
assertEquals(new Integer(3), ints[2]);
assertEquals(new Integer(4), ints[3]);
assertEquals(new Integer(5), ints[4]);
assertEquals(new Integer(6), ints[5]);
assertEquals(new Integer(7), ints[6]);
assertEquals(new Integer(0), ints[7]);
assertEquals(new Integer(8), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift 1 to end
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 4, 9, 1);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(2), ints[2]);
assertEquals(new Integer(3), ints[3]);
assertEquals(new Integer(5), ints[4]);
assertEquals(new Integer(6), ints[5]);
assertEquals(new Integer(7), ints[6]);
assertEquals(new Integer(8), ints[7]);
assertEquals(new Integer(9), ints[8]);
assertEquals(new Integer(4), ints[9]);
//
// Moving to an earlier point in the array
//
// Shift 1 forward
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 8, 3, 1);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(2), ints[2]);
assertEquals(new Integer(8), ints[3]);
assertEquals(new Integer(3), ints[4]);
assertEquals(new Integer(4), ints[5]);
assertEquals(new Integer(5), ints[6]);
assertEquals(new Integer(6), ints[7]);
assertEquals(new Integer(7), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift end 1 forward
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 9, 2, 1);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(9), ints[2]);
assertEquals(new Integer(2), ints[3]);
assertEquals(new Integer(3), ints[4]);
assertEquals(new Integer(4), ints[5]);
assertEquals(new Integer(5), ints[6]);
assertEquals(new Integer(6), ints[7]);
assertEquals(new Integer(7), ints[8]);
assertEquals(new Integer(8), ints[9]);
// Shift 1 to front
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 5, 0, 1);
assertEquals(new Integer(5), ints[0]);
assertEquals(new Integer(0), ints[1]);
assertEquals(new Integer(1), ints[2]);
assertEquals(new Integer(2), ints[3]);
assertEquals(new Integer(3), ints[4]);
assertEquals(new Integer(4), ints[5]);
assertEquals(new Integer(6), ints[6]);
assertEquals(new Integer(7), ints[7]);
assertEquals(new Integer(8), ints[8]);
assertEquals(new Integer(9), ints[9]);
//
// Moving many to a later point in the array
//
// Shift 3 back
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 2, 6, 3);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(5), ints[2]);
assertEquals(new Integer(6), ints[3]);
assertEquals(new Integer(7), ints[4]);
assertEquals(new Integer(8), ints[5]);
assertEquals(new Integer(2), ints[6]);
assertEquals(new Integer(3), ints[7]);
assertEquals(new Integer(4), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift 3 to back
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 2, 7, 3);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(5), ints[2]);
assertEquals(new Integer(6), ints[3]);
assertEquals(new Integer(7), ints[4]);
assertEquals(new Integer(8), ints[5]);
assertEquals(new Integer(9), ints[6]);
assertEquals(new Integer(2), ints[7]);
assertEquals(new Integer(3), ints[8]);
assertEquals(new Integer(4), ints[9]);
// Shift from 3 front
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 0, 5, 3);
assertEquals(new Integer(3), ints[0]);
assertEquals(new Integer(4), ints[1]);
assertEquals(new Integer(5), ints[2]);
assertEquals(new Integer(6), ints[3]);
assertEquals(new Integer(7), ints[4]);
assertEquals(new Integer(0), ints[5]);
assertEquals(new Integer(1), ints[6]);
assertEquals(new Integer(2), ints[7]);
assertEquals(new Integer(8), ints[8]);
assertEquals(new Integer(9), ints[9]);
//
// Moving many to an earlier point in the array
//
// Shift 3 forward
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 6, 2, 3);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(6), ints[2]);
assertEquals(new Integer(7), ints[3]);
assertEquals(new Integer(8), ints[4]);
assertEquals(new Integer(2), ints[5]);
assertEquals(new Integer(3), ints[6]);
assertEquals(new Integer(4), ints[7]);
assertEquals(new Integer(5), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift 3 to front
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 6, 0, 3);
assertEquals(new Integer(6), ints[0]);
assertEquals(new Integer(7), ints[1]);
assertEquals(new Integer(8), ints[2]);
assertEquals(new Integer(0), ints[3]);
assertEquals(new Integer(1), ints[4]);
assertEquals(new Integer(2), ints[5]);
assertEquals(new Integer(3), ints[6]);
assertEquals(new Integer(4), ints[7]);
assertEquals(new Integer(5), ints[8]);
assertEquals(new Integer(9), ints[9]);
// Shift from 3 back
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 7, 3, 3);
assertEquals(new Integer(0), ints[0]);
assertEquals(new Integer(1), ints[1]);
assertEquals(new Integer(2), ints[2]);
assertEquals(new Integer(7), ints[3]);
assertEquals(new Integer(8), ints[4]);
assertEquals(new Integer(9), ints[5]);
assertEquals(new Integer(3), ints[6]);
assertEquals(new Integer(4), ints[7]);
assertEquals(new Integer(5), ints[8]);
assertEquals(new Integer(6), ints[9]);
// Check can't shift more than we have
try {
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 7, 3, 5);
fail();
} catch(IllegalArgumentException e) {
// Good, we don't have 5 from 7 onwards
}
// Check can't shift where would overshoot
try {
ints = getIntsList();
ArrayUtil.arrayMoveWithin(ints, 2, 7, 5);
fail();
} catch(IllegalArgumentException e) {
// Good, we can't fit 5 in starting at 7
}
}
}