Recipe 7.2 Resizing an Array


Problem

The array filled up, and you got an ArrayIndexOutOfBoundsException .

Solution

Make the array bigger.

Discussion

One approach is to allocate the array at a reasonable size to begin with, but if you find yourself with more data than will fit, reallocate a new, bigger array and copy the elements into it.[1] Here is code that does so:

[1] You could copy it yourself using a for loop if you wish, but System.arrayCopy( ) is likely to be faster because it's implemented in native code.

import java.util.Calendar; /** Re-allocate an array, bigger... */ public class Array2  {     public static void main(String argv[]) {         int nDates = 0;         final int MAX = 10;         Calendar[] dates = new Calendar[MAX];         Calendar c;         while ((c=getDate( )) != null) {             // if (nDates >= dates.length) {             //     System.err.println("Too Many Dates! Simplify your life!!");             //     System.exit(1);  // wimp out             // }             // better: reallocate, making data structure dynamic             if (nDates >= dates.length) {                 Calendar[] tmp = new Calendar[dates.length + 10];                 System.arraycopy(dates, 0, tmp, 0, dates.length);                 dates = tmp;    // copies the array reference                 // old array will be garbage collected soon...             }             dates[nDates++] = c;         }         System.out.println("Array size = " + dates.length);     }     static int n;     /* Dummy method to return a sequence of 21 Calendar references,      * so the array should be sized >= 21.      */     public static Calendar getDate( ) {         if (n++ > 21)             return null;         return Calendar.getInstance( );     } }

This technique works reasonably well for simple linear collections of data. For data with a more variable structure, you probably want to use a more dynamic approach, as in Recipe 7.3.



Java Cookbook
Java Cookbook, Second Edition
ISBN: 0596007019
EAN: 2147483647
Year: 2003
Pages: 409
Authors: Ian F Darwin

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net