2010-12-26 10 views
19

Ich habe eine Situation, in der ich ein Kriterium für ein Eingabearray anwenden und ein anderes Array als Ausgabe neu berechnen muss, die kleinere Größe auf der Grundlage der Filterkriterien haben wird.Wie kann ich ein Array initialisieren, ohne es zu kennen?

Jetzt Problem ist, ich weiß nicht die Größe der gefilterten Ergebnisse, so kann ich das Array mit bestimmten Wert nicht initialisieren. Und ich will nicht, dass es große Größe wird Null-Werte, weil ich array.length verwende; später.

Eine Möglichkeit besteht darin, zuerst das ursprüngliche Eingangsarray zu loopen und einen Zähler zu setzen, dann eine weitere Schleife mit dieser Zählerlänge zu erstellen und dieses Array [] zu initialisieren und zu füllen. Aber gibt es den Job in nur einer Schleife?

+3

Warum verwenden Sie nicht ArrayList? –

Antwort

32

Sie können nicht ... die Größe eines Arrays wird immer in Java festgelegt. In der Regel verwenden Sie anstelle eines Arrays eine Implementierung von List<T> hier - normalerweise ArrayList<T>, aber mit vielen anderen verfügbaren Alternativen.

Sie können natürlich ein Array aus der Liste als letzten Schritt erstellen - oder ändern Sie einfach die Signatur der Methode, um mit List<T> zu beginnen.

+0

Warum würden Sie 'ArrayList' in dieser Situation der' LinkedList' vorziehen? – Roman

+0

@Roman: Ich erreiche natürlich ganz einfach eine ArrayList. LinkedList wäre auch in Ordnung ... es ist natürlich in Bezug auf den Speicher teurer, aber es müssen keine Elemente bei der Erweiterung kopiert werden. –

+0

@Roman: Siehe [Wann LinkedList über ArrayList zu verwenden ist] (http://Stackoverflow.com/q/322715/18192) zur Diskussion. Das heißt, Ihre erste Neigung sollte 'ArrayList' sein. – Brian

3

Verwenden Sie stattdessen LinkedList. Dann können Sie bei Bedarf ein Array erstellen.

+1

vereinbart 'ArrayList' wäre wahrscheinlich passender –

+1

@Noel M: warum? Ich denke, das würde es nicht tun. Wir kennen die Anzahl der Elemente nicht. Mit LinkedList funktioniert jede add (date addLast) -Operation in O (1) und macht wirklich einen kleinen Job, während 'ArrayList' automatisch seine Größe mehrmals erhöht und das sind kostspielige Operationen. – Roman

+1

Auf der anderen Seite erstellen Sie mit einer LinkedList ein Node-Objekt für jedes Element. Sie behaupten, dass die Erweiterung eine "kostspielige" Operation ist - es geht nur darum, ein neues Array zu erstellen und die vorhandenen Elemente zu kopieren (was eine schnelle Array-Kopie sein kann). Ich denke nicht, dass es einfach ist zu sagen, was für diese Situation einheitlich "besser" ist. –

3

Verwendung ArrayList. Feldgrße in Java fixiert ist

3

Rück Gerade jede Art von Liste. ArrayList wird in Ordnung sein, es ist nicht statisch.

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

Hier ist der Code für Ihre Klasse. aber das enthält auch viel Refactoring. Bitte fügen Sie ein für jeden statt für. Prost :)

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

Wenn Sie es so machen, können Sie eigentlich nur ein Array deklarieren, keine Sammlungen verwenden.

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