2017-04-24 2 views
0

Im folgenden Code habe ich die Größe eines Arrays geändert, dessen Länge um 5 Elemente erhöht wurde. Länge wird korrekt angezeigt. Aber wenn ich eine Schleife ausführen, um die Elemente des Arrays anzuzeigen, werden nur initialisierte Elemente angezeigt. Wie kann ich alle Elemente anzeigen?Warum wird Array nicht in Java gedruckt, wenn es teilweise initialisiert wird?

package arraychallenge; 

import java.util.*; 


public class ArrayChallenge { 

    public static void main(String[] args) { 

     Scanner CountScanner = new Scanner(System.in); 
     System.out.println("How many integers you have in your list? "); 
     int count = CountScanner.nextInt(); 
     System.out.println("Enter the integers now - "); 
     int[] MyArray = getIntegers(count); 

     System.out.println("Unsorted Array is present here:"); 
     for (int i = 0; i < MyArray.length; i++) { 
      System.out.println(MyArray[i]); 
     } 
     sortArray(MyArray); 
     printArray(MyArray); 

     resizeArray(MyArray, MyArray.length, 5); 
     printArray(MyArray); 


    } 

    public static int[] getIntegers(int count) { 
     Scanner MyScanner = new Scanner(System.in); 
     int[] MyArray = new int[count]; 

     for (int i = 0; i < MyArray.length; i++) { 
      MyArray[i] = MyScanner.nextInt(); 

     } 
     return MyArray; 

    } 

    public static void sortArray(int[] MyArray) { 


     int temp; 

     for (int i = 0; i < MyArray.length; i++) { 

      for (int j = i+1; j < MyArray.length; j++) { 

       if (MyArray[i] > MyArray[j]) { 

        temp = MyArray[i]; 
        MyArray[i] = MyArray[j]; 
        MyArray[j] = temp; 

       } 

      } 

     } 

    } 


    public static void printArray(int[] MyArray) { 
     System.out.println("Sorted Array is present here:"); 
     for (int i = 0; i < MyArray.length; i++) { 
      System.out.println(MyArray[i]); 

     } 
    } 

    public static void resizeArray(int[] MyArray, int count, int increase){ 
     int[] tempArray = MyArray; 
     MyArray = new int[count+increase]; 
     System.out.println("length of MyArray is now " + MyArray.length); 
     for (int i = 0; i < count; i++) { 
      MyArray[i] = tempArray[i]; 

     } 

    } 

} 
+2

Sie können den Verweis des Aufrufers auf 'MyArray' nicht ändern (Ihre Änderungen sind lokal für' resizeArray'). –

+1

Versuchen Sie, 'tempArray' von' resizeArray' zurückzugeben und es 'MyArray' zuzuweisen. – MadProgrammer

+1

Jetzt ändern Sie in der resizeArray-Methode das Array-Objekt nicht genau. Was Sie wissen müssen, ist Folgendes: Wenn Sie ein Objekt an eine Methode übergeben, übergeben Sie einfach die Referenz an dieses Objekt. In der resizeArray-Methode erstellen Sie also ein neues Array-Objekt und weisen dieses neue Array-Objekt dem MyArray-Parameter zu. Sie können die Methode so ändern, dass das MyArray zurückgegeben wird, so dass Sie das neu erstellte Array erhalten können. – Keaz

Antwort

1

In Ihrem reizeArray Methode werden Sie vorbei in . Dann erstellen Sie eine neue Array der Größe 5, und an die Variablen zugewiesen wird, aber das ist nicht das gleiche wie die, die Sie in geben

Lesen Sie diese Antwort:. https://stackoverflow.com/a/40523/3887715

Mein Versuch Eine gute Möglichkeit, um die Objektübergabe zu visualisieren: Stellen Sie sich einen Ballon vor. Das Aufrufen eines fxn ist wie das Verknüpfen einer zweiten Zeichenfolge mit der Sprechblase und die Übergabe der Zeile an das fxn. parameter = new Balloon() schneidet diese Zeichenfolge und erstellt eine neue Sprechblase (dies hat jedoch keine Auswirkungen auf die ursprüngliche Sprechblase). parameter.pop() wird es immer noch öffnen, weil es der Zeichenfolge zu der gleichen, ursprünglichen Sprechblase folgt. Java ist ein pass-by-Wert, aber der übergebene Wert ist nicht tief, er ist auf der höchsten Ebene, d. H. Ein Primitiv oder ein Zeiger. Verwechseln Sie das nicht mit einem tiefen "pass-by-value" -Wert, bei dem das Objekt vollständig geklont und weitergegeben wird. - dhackner 20. Oktober '10 bei 16:38

Kurz gesagt, rufen Sie die Variable in resizeArray, aber es ist nicht das gleiche Sie in main erstellt. Es ist eine neue Variable in resizeArray, die zufällig denselben Namen hat. Wenn Sie also MyArray = new int[count+increase]; tun, ändern Sie nicht Ihre ursprüngliche , Sie ändern eine neue.

Wenn Sie führen dies:

public class ArrayTest { 
    public static void main(String[] args) { 
     int[] array1 = new int[]{1,2,3,4,5}; 
     printArray(array1); 

     increaseArraySize(array1, 5); 
     printArray(array1); 
    } 

    private static void increaseArraySize(int[] array1, int size) { 
     int[] tempArray = array1; 

     array1 = new int[tempArray.length + size]; 

     for (int i = 0; i < tempArray.length; i++) { 
      array1[i] = tempArray[i]; 
     } 

     printArray(array1); 
    } 

    public static void printArray(int[] MyArray) { 
     System.out.println("Sorted Array is present here:"); 
     for (int i = 0; i < MyArray.length; i++) { 
      System.out.println(MyArray[i]); 

     } 
    } 
} 

Sie erhalten:

1 
2 
3 
4 
5 
1 
2 
3 
4 
5 
0 
0 
0 
0 
0 
1 
2 
3 
4 
5 

So können Sie die 0er zu sehen sind zum zweiten Mal gedruckt wird, die printArray Methode aufgerufen wird.

Wenn Sie den Namen in resizeArray ändern, vielleicht wird das Ihnen helfen, zu verstehen.

Wie von den Kommentaren vorgeschlagen, können Sie ein Array zurückgeben und dann zu in main() zurück zuweisen.

Verwandte Themen