2012-04-03 13 views
2

Ich muss dynamische Array mit in Java finden. Ich weiß, ich Arraylist oder Liste verwenden können, aber ich kann sie jetzt verwenden, habe ich wirklich Mühe darüber zu finden, aber ich konnte nicht finden, wie nicht statisch verwenden (dynamisch) Array ohne Kollektionen dankJava nicht-statische Array

+2

Warum müssen Sie ein dynamisches Array erstellen? Warum können Sie keine Sammlungen verwenden? Was versuchst du zu machen? Wie versagst du? – npinti

+0

Es ist mein Projekt und ich verkrafte dies etwa 6 Tage und kann immer noch nicht finden, wie man dynamische Arrays ohne Sammlungen erstellt, nur Sammlungen sind verboten – engineer

+0

Wenn Sie Sammlungen nicht verwenden können, müssen Sie jedes Mal ein Array erstellen füge etwas hinzu, wie unten vorgeschlagen, oder erstelle beim ersten Mal ein sehr großes Array und füge weitere Dinge hinzu. Wenn ich bei dir wäre würde ich mit der ersten Wahl gehen. – npinti

Antwort

6

Arrays haben eine feste Länge in Java. Es gibt keinen Weg dahin.

Wenn Sie eine N hinzufügen möchten: te Element in ein Array, arr mit Länge N-1 dann musst du

  1. ein neues Array erstellen.
  2. Kopieren Sie den Inhalt des alten Arrays in das neue Array
  3. Ersetzen Sie alle Verweise auf das alte Array mit Verweisen auf das neue Array.

In Code entsprechen diese Schritte

int[] newArr = new int[N]; 
System.arraycopy(arr, 0, newArr, 0, arr.length); 
arr = newArr; 

oder, etwas kürzer durch Arrays.copyOf von Java unter Verwendung von 6:

int[] newArr = Arrays.copyOf(arr, N); 
arr = newArr; 
+0

beste Lösung +1 –

+0

Es bietet dynamische Array mit? – engineer

+0

Nein. Es * ersetzt * das alte Array durch ein neues Array, das länger ist. In Java gibt es kein dynamisches Array. Wenn Sie die Collections-API nicht verwenden können, schlage ich vor, dass Sie eine eigene Listenklasse schreiben, die diese Funktionalität bietet. – aioobe

1

Normalen Arrays in Java sind nicht dynamisch, so dass, wenn Sie wollen Ändern Sie die Größe des Arrays, Sie müssen eine neue erstellen und den Inhalt der vorherigen in sie kopieren.

können Sie tun das, Arrays#copyOf Methode zu erstellen und kopieren Sie sie auf einfache Art und Weise:

int[] myNewIntArray = Arrays.copyOf(oldIntArray, newArraySize); 
+0

Es bietet dynamische Verwendung? – engineer

+0

Nein, dies ist nur eine bequeme Möglichkeit, ein neues Array zu erstellen und den Inhalt in einer Zeile zu kopieren. – MByD

+0

Ich muss Elemente aus nicht-festen Größe Array erstellen und löschen, deshalb brauche ich wie ein dynamisches Array – engineer

0

Sie sie einfach so vergeben:

int[] array = new int[17]; 
+1

jemals von dynamischen Arrays gehört? http://en.wikipedia.org/wiki/Dynamic_array – n0rm1e

+0

eine andere Terminologie wird in c verwendet, dies deutete mir an, dass OP von einem c-Hintergrund kam und nur ein Array zuordnen wollte. – vidstige

+0

danke für deine antwort – engineer

1

Sie können Ihre eigene dynamische Array implementieren. Erstellen Sie ein Array der Größe 1 (oder n, wenn eine anfängliche Größe bereitgestellt wird), verdoppeln Sie dann die Größe und kopieren Sie vorhandene Elemente, sobald sie die Kapazität erreicht haben.

Und dies wird eine amortisierte Kosten von 3 pro Operation haben, 3n für n Elemente, was bedeutet, dass Sie das in o (n) Zeit beibehalten können.

Eine sehr einfache naive Implementierung (für int-Array) wäre:

class DynamicIntArray 
{ 
    private int capacity; 
    private int[] array; 
    private int size = 0; 

    public DynamicIntArray() 
    { 
     this(1); 
    } 

    public DynamicIntArray(int capacity) 
    { 
     this.capacity = capacity; 
     array = new int[this.capacity]; 
    } 

    public void add(int a) 
    { 
     if (size == capacity) 
      resize(); 
     array[size] = a; 
     size++; 
    } 

    private void resize() 
    { 
     capacity *= 2; 
     array = Arrays.copyOf(array, capacity); 
    } 

    // Implement the rest 
} 

Hier ist, wie Sie es verwenden würde:

DynamicIntArray dynamicArray = new DynamicIntArray(); 
dynamicArray.add(1); 
dynamicArray.add(2); 
dynamicArray.add(3); 

Wenn Sie es ändern Generika zu verwenden, können Sie es verwenden für alles, nicht nur für ganze Zahlen.

+0

wie kann das verwendet werden? Es braucht statische Variable? – engineer

+0

Ich werde meine Antwort mit einer einfachen Implementierung aktualisieren. – n0rm1e

+0

danke, aber können Sie Syntax von diesem zeigen? – engineer

0

Sie können eine Sammlung verwenden, bis das Array vom Typ benötigt wird, und dann Ihr Array mithilfe der Funktion Collection.toArray() abrufen.

+0

ich denke, es ist nicht geeignet mit, aber danke – engineer

0

Sie könnten dynamisches Verhalten nachahmen, indem Sie ein neues Array erstellen, wenn es fast voll ist, z. B. ein neues Array mit der doppelten Länge des ursprünglichen Arrays erstellen und alle Elemente kopieren.

+0

danke für Ihre Antwort – engineer

0

Ich denke, du würdest noch bessere Antworten erhalten, wenn du erklärst, was du zu tun versuchst und warum du Collections nicht benutzen kannst oder willst. Was genau ist das Problem, das Sie versuchen zu lösen?

+0

danke für Ihre Antwort – engineer