Moved SortableArrayList.binarySearch functionality into ArrayUtil to make

it generally accessible. Moved test code from ArrayUtil into separate
JUnit test class.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@809 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2002-08-12 01:10:32 +00:00
parent ef75007784
commit 8ce40edfe3
3 changed files with 176 additions and 101 deletions
@@ -1,5 +1,5 @@
//
// $Id: ArrayUtil.java,v 1.11 2002/08/10 18:45:27 mdb Exp $
// $Id: ArrayUtil.java,v 1.12 2002/08/12 01:10:32 mdb Exp $
//
// samskivert library - useful routines for java programs
// Copyright (C) 2001 Walter Korman
@@ -21,6 +21,7 @@
package com.samskivert.util;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;
import com.samskivert.Log;
@@ -191,78 +192,76 @@ public class ArrayUtil
}
}
public static void main (String[] args)
/**
* Performs a binary search, attempting to locate the specified
* object. The array must be sorted for this to operate correctly and
* the contents of the array must all implement {@link Comparable}
* (and actually be comparable to one another).
*
* @param array the array of {@link Comparable}s to be searched.
* @param offset the index of the first element in the array to be
* considered.
* @param length the number of elements including and following the
* element at <code>offset</code> to consider when searching.
* @param key the object to be located.
*
* @return the index of the object in question or
* <code>(-(<i>insertion point</i>) - 1)</code> (always a negative
* value) if the object was not found in the list.
*/
public static int binarySearch (
Object[] array, int offset, int length, Object key)
{
// test reversing an array
int[] values = new int[] { 0 };
int[] work = (int[])values.clone();
reverse(work);
Log.info("reverse: " + StringUtil.toString(work));
int low = offset, high = offset+length-1;
while (low <= high) {
int mid = (low + high) >> 1;
Comparable midVal = (Comparable)array[mid];
int cmp = midVal.compareTo(key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid; // key found
}
}
return -(low + 1); // key not found.
}
values = new int[] { 0, 1, 2 };
work = (int[])values.clone();
reverse(work);
Log.info("reverse: " + StringUtil.toString(work));
work = (int[])values.clone();
reverse(work, 0, 2);
Log.info("reverse first-half: " + StringUtil.toString(work));
work = (int[])values.clone();
reverse(work, 1, 2);
Log.info("reverse second-half: " + StringUtil.toString(work));
values = new int[] { 0, 1, 2, 3, 4 };
work = (int[])values.clone();
reverse(work, 1, 3);
Log.info("reverse middle: " + StringUtil.toString(work));
values = new int[] { 0, 1, 2, 3 };
work = (int[])values.clone();
reverse(work);
Log.info("reverse even: " + StringUtil.toString(work));
// test shuffling two elements
values = new int[] { 0, 1 };
work = (int[])values.clone();
shuffle(work, 0, 1);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 1, 1);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
// test shuffling three elements
values = new int[] { 0, 1, 2 };
work = (int[])values.clone();
shuffle(work, 0, 2);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 1, 2);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
// test shuffling ten elements
values = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
work = (int[])values.clone();
shuffle(work, 0, 5);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 5, 5);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
/**
* Performs a binary search, attempting to locate the specified
* object. The array must be in the sort order defined by the supplied
* {@link Comparator} for this to operate correctly.
*
* @param array the array of objects to be searched.
* @param offset the index of the first element in the array to be
* considered.
* @param length the number of elements including and following the
* element at <code>offset</code> to consider when searching.
* @param key the object to be located.
* @param comp the comparator to use when searching.
*
* @return the index of the object in question or
* <code>(-(<i>insertion point</i>) - 1)</code> (always a negative
* value) if the object was not found in the list.
*/
public static int binarySearch (
Object[] array, int offset, int length, Object key, Comparator comp)
{
int low = offset, high = offset+length-1;
while (low <= high) {
int mid = (low + high) >> 1;
Object midVal = array[mid];
int cmp = comp.compare(midVal, key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid; // key found
}
}
return -(low + 1); // key not found.
}
/** The random object used when shuffling an array. */
@@ -1,5 +1,5 @@
//
// $Id: SortableArrayList.java,v 1.4 2002/06/18 00:48:04 mdb Exp $
// $Id: SortableArrayList.java,v 1.5 2002/08/12 01:10:32 mdb Exp $
//
// samskivert library - useful routines for java programs
// Copyright (C) 2001 Michael Bayne
@@ -79,23 +79,9 @@ public class SortableArrayList extends AbstractList
*/
public int binarySearch (Object key)
{
int low = 0, high = _size-1;
while (low <= high) {
int mid = (low + high) >> 1;
Object midVal = _elements[mid];
int cmp = ((Comparable)midVal).compareTo(key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid; // key found
}
}
return -(low + 1); // key not found.
return ArrayUtil.binarySearch(_elements, 0, _size, key);
}
/**
* Performs a binary search, attempting to locate the specified
* object. The array must be in the sort order defined by the supplied
@@ -107,20 +93,7 @@ public class SortableArrayList extends AbstractList
*/
public int binarySearch (Object key, Comparator comp)
{
int low = 0, high = _size-1;
while (low <= high) {
int mid = (low + high) >> 1;
Object midVal = _elements[mid];
int cmp = comp.compare(midVal, key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid; // key found
}
}
return -(low + 1); // key not found.
return ArrayUtil.binarySearch(_elements, 0, _size, key, comp);
}
// documentation inherited from interface
@@ -0,0 +1,103 @@
//
// $Id: ArrayUtilTest.java,v 1.1 2002/08/12 01:10:32 mdb Exp $
package com.samskivert.util;
import junit.framework.Test;
import junit.framework.TestCase;
/**
* Tests the {@link ArrayUtil} class.
*/
public class ArrayUtilTest extends TestCase
{
public ArrayUtilTest ()
{
super(ArrayUtilTest.class.getName());
}
public void runTest ()
{
// test reversing an array
int[] values = new int[] { 0 };
int[] work = (int[])values.clone();
reverse(work);
Log.info("reverse: " + StringUtil.toString(work));
values = new int[] { 0, 1, 2 };
work = (int[])values.clone();
reverse(work);
Log.info("reverse: " + StringUtil.toString(work));
work = (int[])values.clone();
reverse(work, 0, 2);
Log.info("reverse first-half: " + StringUtil.toString(work));
work = (int[])values.clone();
reverse(work, 1, 2);
Log.info("reverse second-half: " + StringUtil.toString(work));
values = new int[] { 0, 1, 2, 3, 4 };
work = (int[])values.clone();
reverse(work, 1, 3);
Log.info("reverse middle: " + StringUtil.toString(work));
values = new int[] { 0, 1, 2, 3 };
work = (int[])values.clone();
reverse(work);
Log.info("reverse even: " + StringUtil.toString(work));
// test shuffling two elements
values = new int[] { 0, 1 };
work = (int[])values.clone();
shuffle(work, 0, 1);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 1, 1);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
// test shuffling three elements
values = new int[] { 0, 1, 2 };
work = (int[])values.clone();
shuffle(work, 0, 2);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 1, 2);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
// test shuffling ten elements
values = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
work = (int[])values.clone();
shuffle(work, 0, 5);
Log.info("first-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work, 5, 5);
Log.info("second-half shuffle: " + StringUtil.toString(work));
work = (int[])values.clone();
shuffle(work);
Log.info("full shuffle: " + StringUtil.toString(work));
}
public static Test suite ()
{
return new ArrayUtilTest();
}
public static void main (String[] args)
{
ArrayUtilTest test = new ArrayUtilTest();
test.runTest();
}
}