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:
parent
4864da55d5
commit
19894ffa53
@ -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
|
||||
}
|
||||
}
|
||||
|
291
src/testcases/org/apache/poi/util/TestArrayUtil.java
Normal file
291
src/testcases/org/apache/poi/util/TestArrayUtil.java
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user