2010-12-26 27 views
19

Tengo una situación en la que tengo que aplicar un criterio en una matriz de entrada y volver a enviar otra matriz como salida, que tendrá un tamaño más pequeño en función de los criterios de filtrado.¿Cómo puedo inicializar una matriz sin conocer su tamaño?

Ahora el problema es que no sé el tamaño de los resultados filtrados, por lo que no puedo inicializar la matriz con un valor específico. Y no quiero que sea de gran tamaño va a anular valores porque estoy usando array.length; mas tarde.

Una forma es hacer primero un bucle en la matriz de entrada original y establecer un contador, y luego hacer otro bucle con esa longitud del contador e inicializar y llenar esta matriz []. ¿Pero hay alguna forma de hacer el trabajo en un solo ciclo?

+3

¿por qué no utiliza ArrayList? –

Respuesta

32

No se puede ... el tamaño de una matriz siempre está fijado en Java. Normalmente, en lugar de utilizar una matriz, utilizaría una implementación de List<T> aquí, generalmente ArrayList<T>, pero con muchas otras alternativas disponibles.

Puede crear una matriz de la lista como paso final, por supuesto, o simplemente cambie la firma del método para devolver un List<T> para comenzar.

+0

¿por qué preferirías 'ArrayList' a' LinkedList' en esta situación? – Roman

+0

@Roman: simplemente, naturalmente, busco una ArrayList en general. LinkedList estaría bien también ... es más costoso en términos de memoria, por supuesto, pero no requiere copiar elementos en la expansión. –

+0

@Roman: Consulte [Cuándo utilizar LinkedList sobre ArrayList] (http://stackoverflow.com/q/322715/18192) para la discusión. Dicho esto, su primera inclinación debería ser 'ArrayList'. – Brian

3

Use LinkedList en su lugar. Entonces, puedes crear una matriz si es necesario.

+1

'ArrayList' probablemente sería más apropiado –

+1

@Noel M: ¿por qué? Creo que no. No sabemos la cantidad de elementos. Entonces, con LinkedList cada operación add (es decir, addLast) funciona en O (1) y realmente hace un pequeño trabajo, mientras que 'ArrayList' aumentará automáticamente su tamaño varias veces y estas son operaciones costosas. – Roman

+1

Por otro lado, con LinkedList está creando un objeto Node para cada elemento. Usted afirma que la expansión es una operación "costosa"; solo se trata de crear una nueva matriz y copiar los elementos existentes (que pueden ser una copia de matriz rápida). No creo que sea simple decir cuál es uniformemente "mejor" para esta situación. –

3

Uso ArrayList. tamaño de la matriz se fija en Java

3

sólo devuelve cualquier tipo de lista. ArrayList estará bien, no es estático.

ArrayList<yourClass> list = new ArrayList<yourClass>(); 
for (yourClass item : yourArray) 
{ 
    list.add(item); 
} 
0

Aquí está el código para su clase. pero esto también contiene mucha refactorización. Por favor, agregue un para cada uno en lugar de para. aplausos :)

static int isLeft(ArrayList<String> left, ArrayList<String> right) 

    { 
     int f = 0; 
     for (int i = 0; i < left.size(); i++) { 
      for (int j = 0; j < right.size(); j++) 

      { 
       if (left.get(i).charAt(0) == right.get(j).charAt(0)) { 
        System.out.println("Grammar is left recursive"); 
        f = 1; 
       } 

      } 
     } 
     return f; 

    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     ArrayList<String> left = new ArrayList<String>(); 
     ArrayList<String> right = new ArrayList<String>(); 


     Scanner sc = new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n = sc.nextInt(); 
     for (int i = 0; i < n; i++) { 
      System.out.println("enter left prod"); 
      String leftText = sc.next(); 
      left.add(leftText); 
      System.out.println("enter right prod"); 
      String rightText = sc.next(); 
      right.add(rightText); 
     } 

     System.out.println("the productions are"); 
     for (int i = 0; i < n; i++) { 
      System.out.println(left.get(i) + "->" + right.get(i)); 
     } 
     int flag; 
     flag = isLeft(left, right); 
     if (flag == 1) { 
      System.out.println("Removing left recursion"); 
     } else { 
      System.out.println("No left recursion"); 
     } 

    } 
2

Si lo haces así, en realidad puedes simplemente declarar una matriz, sin usar ninguna colección.

ClassName[] arrayname; 
    ... 
arrayname = new ClassName[10*15*100*variable+CONSTANT+Math.ciel(Math.Random())]; 
Cuestiones relacionadas