How to make an array of arrays in Java

JavaArrays

Java Problem Overview


Hypothetically, I have 5 string array objects:

String[] array1 = new String[];
String[] array2 = new String[];
String[] array3 = new String[];
String[] array4 = new String[];
String[] array5 = new String[];

and I want another array object to contain those 5 string array objects. How do I do it? Can I put it in another array?

Java Solutions


Solution 1 - Java

Like this:

String[][] arrays = { array1, array2, array3, array4, array5 };

or

String[][] arrays = new String[][] { array1, array2, array3, array4, array5 };

(The latter syntax can be used in assignments other than at the point of the variable declaration, whereas the shorter syntax only works with declarations.)

Solution 2 - Java

try

String[][] arrays = new String[5][];

Solution 3 - Java

While there are two excellent answers telling you how to do it, I feel that another answer is missing: In most cases you shouldn't do it at all.

Arrays are cumbersome, in most cases you are better off using the Collection API.

With Collections, you can add and remove elements and there are specialized Collections for different functionality (index-based lookup, sorting, uniqueness, FIFO-access, concurrency etc.).

While it's of course good and important to know about Arrays and their usage, in most cases using Collections makes APIs a lot more manageable (which is why new libraries like Google Guava hardly use Arrays at all).

So, for your scenario, I'd prefer a List of Lists, and I'd create it using Guava:

List<List<String>> listOfLists = Lists.newArrayList();
listOfLists.add(Lists.newArrayList("abc","def","ghi"));
listOfLists.add(Lists.newArrayList("jkl","mno","pqr"));

Solution 4 - Java

there is the class I mentioned in the comment we had with Sean Patrick Floyd : I did it with a peculiar use which needs WeakReference, but you can change it by any object with ease.

Hoping this can help someone someday :)

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;


/**
 *
 * @author leBenj
 */
public class Array2DWeakRefsBuffered<T>
{
	private final WeakReference<T>[][] _array;
	private final Queue<T> _buffer;

	private final int _width;

	private final int _height;

	private final int _bufferSize;

	@SuppressWarnings( "unchecked" )
	public Array2DWeakRefsBuffered( int w , int h , int bufferSize )
	{
		_width = w;
		_height = h;
		_bufferSize = bufferSize;
		_array = new WeakReference[_width][_height];
		_buffer = new LinkedList<T>();
	}

	/**
	 * Tests the existence of the encapsulated object
	 * /!\ This DOES NOT ensure that the object will be available on next call !
	 * @param x
	 * @param y
	 * @return
	 * @throws IndexOutOfBoundsException
	 */public boolean exists( int x , int y ) throws IndexOutOfBoundsException
	{
		if( x >= _width || x < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
		}
		if( y >= _height || y < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
		}
		if( _array[x][y] != null )
		{
			T elem = _array[x][y].get();
			if( elem != null )
			{
			return true;
			}
		}
		return false;
	}

	/**
	 * Gets the encapsulated object
	 * @param x
	 * @param y
	 * @return
	 * @throws IndexOutOfBoundsException
	 * @throws NoSuchElementException
	 */
	public T get( int x , int y ) throws IndexOutOfBoundsException , NoSuchElementException
	{
		T retour = null;
		if( x >= _width || x < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ x = " + x + "]" );
		}
		if( y >= _height || y < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (get) : [ y = " + y + "]" );
		}
		if( _array[x][y] != null )
		{
			retour = _array[x][y].get();
			if( retour == null )
			{
			throw new NoSuchElementException( "Dereferenced WeakReference element at [ " + x + " ; " + y + "]" );
			}
		}
		else
		{
			throw new NoSuchElementException( "No WeakReference element at [ " + x + " ; " + y + "]" );
		}
		return retour;
	}

	/**
	 * Add/replace an object
	 * @param o
	 * @param x
	 * @param y
	 * @throws IndexOutOfBoundsException
	 */
	public void set( T o , int x , int y ) throws IndexOutOfBoundsException
	{
		if( x >= _width || x < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ x = " + x + "]" );
		}
		if( y >= _height || y < 0 )
		{
			throw new IndexOutOfBoundsException( "Index out of bounds (set) : [ y = " + y + "]" );
		}
		_array[x][y] = new WeakReference<T>( o );
		
		// store local "visible" references : avoids deletion, works in FIFO mode
		_buffer.add( o );
		if(_buffer.size() > _bufferSize)
		{
			_buffer.poll();
		}
	}

}

Example of how to use it :

// a 5x5 array, with at most 10 elements "bufferized" -> the last 10 elements will not be taken by GC process
Array2DWeakRefsBuffered<Image> myArray = new Array2DWeakRefsBuffered<Image>(5,5,10);
Image img = myArray.set(anImage,0,0);
if(myArray.exists(3,3))
{
    System.out.println("Image at 3,3 is still in memory");
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTerence PonceView Question on Stackoverflow
Solution 1 - JavaJon SkeetView Answer on Stackoverflow
Solution 2 - JavaPeter LawreyView Answer on Stackoverflow
Solution 3 - JavaSean Patrick FloydView Answer on Stackoverflow
Solution 4 - JavaBenjView Answer on Stackoverflow