Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen?

Jakonfire

Mitglied
Ich brauche für eine Aufgabe einen komplett leeren Array vom Typ int. Es werden bei manchen Tests teilweise (absichtlich) nicht alle Felder gefüllt und deshalb wird an diesen Stellen 0 ausgegeben (es soll kompletter Array ausgegeben werden, teilweise auch 0 als Wert). Wenn ich den Array wie im Code Beispiel versuche zu füllen passen aber die Datentypen nicht. Hat jemand eine andere Idee?

Java:
        int[] zahlen = new int[26];
        for(int i = 0; i < 26; i++){       
            zahlen[i] = "";
        }
 
Was ist leer für dich? Wenn du ein primitives Array initialisierst werden da Standardwerte hineingeschrieben. D.h. in deinem Fall stehen da 26 mal die Ziffer 0 drin.
 
Wenn du zwischen int Zahlen und leer unterscheiden willst, dann wäre ein Referenztyp eine Möglichkeit:

Integer[] zahlen = new Integer[26]();
Damit hast Du dann auch am Anfang alles auf null. Und wenn du jetzt einzelne Zahlen einfügst kannst Du unterscheiden ob es null ist oder eine Zahl.
 
Wenn du zwischen int Zahlen und leer unterscheiden willst, dann wäre ein Referenztyp eine Möglichkeit:

Integer[] zahlen = new Integer[26]();
Damit hast Du dann auch am Anfang alles auf null. Und wenn du jetzt einzelne Zahlen einfügst kannst Du unterscheiden ob es null ist oder eine Zahl.
So habe ich es auch gemacht, aber wie unterscheide ich zwischen einer 0 die vorher drin stand und einer die eingelesen wurde?
 
Du unterscheidest zwischen null und 0. null ist die null-Referenz und 0 ist der Integer mit Wert 0.

Edit: Und bitte auch beachten: Du hast int gehabt und nicht Integer. int ist der value type und Integer ist eine Klasse (Wrapper typ für int, so dass es automatisches Boxing / Unboxing gibt).
 
Du unterscheidest zwischen null und 0. null ist die null-Referenz und 0 ist der Integer mit Wert 0.

Edit: Und bitte auch beachten: Du hast int gehabt und nicht Integer. int ist der value type und Integer ist eine Klasse (Wrapper typ für int, so dass es automatisches Boxing / Unboxing gibt).
Also kann ich zum Bespiel die Werte dann so abfragen und ggf. ausgeben?

if(zahlen[k] != null){System.out.print ...
 
Ja, mit genau so einem Check kannst Du unterscheiden zwischen: Wert vorhanden oder eben kein Wert vorhanden.
 
Dann zeige doch einmal den ganzen Code. Was ist zahlen für eine Variable?

Also sowas funktioniert:
Java:
    Integer[] zahlen = new Integer[10];
    if (zahlen[0] != null)
        System.out.println("Not null!");

Wenn zahlen ein int Array ist, bekomme ich auch eine andere Meldung ("error: incomparable types: int and <null>").
 
Das ist der gesamte Code:
Java:
import java.util.Scanner;
public class Statistik {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String groesse = args[0];
        String anzahl = args[1];
        int menge = Integer.parseInt(anzahl);
        int a = Integer.parseInt(groesse);
        
        int merke = 0;
        int stelle = 0;
        String ausgabe1 = "";
        String ausgabe2 = "";
        
        int zahlen [] = new int [a];
        int haeufigkeit [] = new int [a];
        int pos = 0;
        boolean flag;
      
        
        
        for (int i = 0; i < menge; i++){
                merke = in.nextInt();
            for(int j = 0; j < a; j++){   
                if(merke == zahlen[j]){
                    flag = true;
                    haeufigkeit[j] = haeufigkeit[j] + 1;
                }
            if(flag != true){
                zahlen[stelle] = merke;
                haeufigkeit[stelle] = haeufigkeit[stelle] + 1;
                stelle = stelle + 1;
                }
            flag = false;
        }
        for(int k = 0; k < a; k++){
            if(zahlen[k] != null){
                    ausgabe1 = ausgabe1 + zahlen[k] + ", ";
                    ausgabe2 = ausgabe2 + haeufigkeit[k] + ", ";
                }
            }
        }
        System.out.println(ausgabe1);
        System.out.println(ausgabe2);
    }
}
 
Du hast Zahlen ja auch weiterhin als int Array und nicht als Integer Array.

Ein int Array kann keine null Werte haben, da es ein Value Type ist.
Du musst es zu einem Integer Array machen!

Und um gleich den nächsten Fehler zu erwähnen: Deine Variable flag wird nur innerhalb eines ifs gesetzt. Daher kann die Prüfung erfolgen, wenn es noch nicht initialisiert wurde -> Bei der Deklaration gleich auf false setzen!
 
Du hast Zahlen ja auch weiterhin als int Array und nicht als Integer Array.

Ein int Array kann keine null Werte haben, da es ein Value Type ist.
Du musst es zu einem Integer Array machen!

Und um gleich den nächsten Fehler zu erwähnen: Deine Variable flag wird nur innerhalb eines ifs gesetzt. Daher kann die Prüfung erfolgen, wenn es noch nicht initialisiert wurde -> Bei der Deklaration gleich auf false setzen!
Achso okay, hatte dein Edit überlesen. Dachte boolean ist Standard immer false? Aber danke, ändere ich auch gleich.
 
Achso okay, hatte dein Edit überlesen. Dachte boolean ist Standard immer false? Aber danke, ändere ich auch gleich.
Wenn Variablen automatisch initialisiert werden, dann ist die Initialisierung immer das neutrale Element wenn man so will. Bei Referenz-Typen ist dies null, bei Zahlen 0, bei boolean false.

Aber es gibt viele unterschiedliche Variablen wenn man so möchte:
Instanz- und Klassenvariablen: diese werden automatisch initialisiert.
Array Elemente: Diese werden bei Erstellung eines Arrays initialisiert.
lokale Variablen: diese werden nicht initialisiert und es kann erst lesend auf diese zugegriffen werden, nachdem sie initialisiert wurden.
Parameter: Diese werden automatisch durch den angegebenen Parameterwert initialisiert

Das findet sich im Detail in der Java Language Specification 4.12.5:
"A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment))."
 
Danke, funktioniert. Programm selbst noch nicht, da gibt er mir in Zeile 25 noch den Fehler java.lang.NullPointerException
Ja, das ist verständlich, denn Du kannst ja jetzt null Werte haben.

Zeile 25 ist ja:
Java:
if(merke == zahlen[j]){

merke ist ein int, zahlen[j] ein Integer.
Zum Vergleichen will Java nun aus dem Integer ein int machen, da dort aber null steht, gibt es die NPE.
 
Ja, das ist verständlich, denn Du kannst ja jetzt null Werte haben.

Zeile 25 ist ja:
Java:
if(merke == zahlen[j]){

merke ist ein int, zahlen[j] ein Integer.
Zum Vergleichen will Java nun aus dem Integer ein int machen, da dort aber null steht, gibt es die NPE.
Ah okay, danke. Also muss merke auch ein Integer statt int sein?
 
Wenn Du merke zu einem Integer machst, dann dürfte die NPE weg sein.

Alternativ kannst Du aber auch auf null prüfen:
Java:
if(zahlen[j] != null && merke == zahlen[j]) {
 
Wenn Du merke zu einem Integer machst, dann dürfte die NPE weg sein.

Alternativ kannst Du aber auch auf null prüfen:
Java:
if(zahlen[j] != null && merke == zahlen[j]) {
Ja scheint beides zu funktionieren, deine zweite gefällt mir aber besser.
Dafür jetzt in Zeile 29 dieser Fehler: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Aber der hat wahrscheinlich andere Ursachen.
 

Zurück
Oben