2

I have a list of String[] that contains some data returned from a database

List<String[]> x;

Now for each "x" I have to store its relative Ys. (Imagine that "x" contains the elements returned from a "SELECT DISTINCT xColumn1, xColumn2 FROM table" and now for each element I have to store the data from another query).

Y's elements are going to be stored here:

List<List<String[]>> yElements;

I've read that I can declare a fixed length list, but I don't know how. This is what I have done:

yElements = Arrays.asList(new List<String[]>[x.sixe()]);

Netbeans told me "generic array creation" error.

I also want to tell you that I MUST have a fixed lenght list to store a List of String[ ] in a specific index of this List of Lists. (If you can show me how to do with an array it would be great, too!) Thanks.

Immortal
  • 23
  • 5

2 Answers2

0

You cannot create an instance of an array of a generic type using new.

One alternative is this:

import java.lang.reflect.*;
import java.util.*;

public class Test
{
    public static void main( String args[] )
    {
        List<String[]> x = ...;
        List<List<String[]>> yElements = Arrays.asList(
                (List<String[]>[])Array.newInstance(List.class, x.size()));
    }
}

Related question: How to create a generic array in Java?. (The example there is about creating an instance of an array of a generic type parameter ... but the same approach applies here.)


However, I think that this whole question is based on an incorrect assumption.

I also want to tell you that I MUST have a fixed lenght list to store a List of String[ ] in a specific index of this List of Lists.

You don't HAVE TO have a fixed sized list. From the computational perspective, your code would work just fine with a non-fixed sized list ... provided that you don't add or remove list elements. (In fact, using Arrays.asList to wrap an array won't stop some other code trying to add / remove elements ...) Anyway ... if you just make the implementation type ArrayList<ArrayList<ArrayList<String>>>, then the generic array creation problem goes away.

In addition, I suspect that it is incorrect to use x.size() as the size of yElements. The size of yElements probably should be determined by the number of x instances there are going to be, not the size of a given x instance.

Community
  • 1
  • 1
Stephen C
  • 632,615
  • 86
  • 730
  • 1,096
  • I "have to" because of my implementation in threads and, yes, x.size() is the correct length but I have to admit that probably I was not so much clear to describe my problem :) BTW, Thank you for your time. The first part of your comment is very interesting! – Immortal Nov 25 '12 at 23:15
0

If you want your lists to be absolutely fixed size, you could use the native arrays. They can be multi-dimensional so for example you can have String[][] x or `String[][][] y'.

Honestly however, your approach is a bit confusing and not that crisp from a design point of view.

Why not, similarly to as was suggested in the comment, have an object which has both columns (xColumn1, xColumn2), and then have the Y elements in a separate object, which can then be associated with the first one?

so:

class XDetails
{
   String xColumn1;
   String xColumn2;

   YDetails relatedY;
   ...
}

class YDetails
{
   ... fields of Y ...

}

Then you can have an array or List<XDetails>

jbx
  • 18,832
  • 14
  • 73
  • 129
  • This is what I've done: `class A { String[] xColumn; private Yelements[] yElements; } class Yelements { List yElements; } ` Now works like a charm. Thank you! – Immortal Nov 25 '12 at 23:21