wie am besten 2D Array von String to Integer

belana

Neues Mitglied
Java:
        public static void main(String[] args) throws IOException {
            
             String [][] array = new String[10][2]; 
                        
            File datei = new File("test.csv");
               BufferedReader br = new BufferedReader(new FileReader(datei));
               String line = "";
               try {
                  
                   int i = 0;
                  
                   while ((line = br.readLine()) != null) {
                      
                   String [] column = line.split(",");
                   System.out.println(column[0] + " " + column[1]);
                  
                   i++;
                    }
               } catch (FileNotFoundException e) {
               e.printStackTrace();
          }
    }

Hallo an alle, als String-Array funktioniert bei mir bisher alles wunderbar, ich kann auch alles damit machen was ich möchte.
Mein Problem ist aber das ich es bisher nicht hinbekommen habe, die Datei direkt als Integer Array abzuspeichern oder das Array zu konvertiern.
Da ich gerne einige Rechnungen durchführen würde sowie mehrfache Änderungen der Array Werte bietet sich für mich leider das Integer.parseInt() was mit System.out super funktioniert gar nicht an.
 
Java:
package strings;

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        storeStrings(new String[][]{{"eins", "zwei"}}, "blabla.txt");
        storeInts(new Integer[][]{{1, 2}, {3, 4}}, "zahlen.txt");
        System.out.println(Arrays.deepToString(readInts("zahlen.txt")));
        System.out.println(Arrays.deepToString(readStrings("blabla.txt")));
    }

    public static void storeStrings(String[][] strings, String fn) throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fn))) {
            oos.writeObject(strings);
            oos.flush();
        }
    }

    public static String[][] readStrings(String fn) throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fn))) {
            return (String[][]) ois.readObject();
        }
    }

    public static void storeInts(Integer[][] ints, String fn) throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fn))) {
            oos.writeObject(ints);
            oos.flush();
        }
    }

    public static Integer[][] readInts(String fn) throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fn))) {
            return (Integer[][]) ois.readObject();
        }
    }
}
 
Wenn du das Textfile / csv File mit Zahlen einlesen willst, dann geht das schon genau so, wie du es gemacht hast.
Du musst die Strings dann nur noch parsen. Das ginge mit Integer.parseInt. Sprich nach dem Split Aufruf auf jedem Element von columns ein solcher Aufruf.
 
Ooooooops, hab gar nicht gesehn das man die Methoden generisch hätte machen können...

Java:
package strings;

import java.io.*;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        store(new String[][]{{"eins", "zwei"}}, "blabla.txt");
        store(new Integer[][]{{1, 2}, {3, 4}}, "zahlen.txt");
        System.out.println(Arrays.deepToString(read("zahlen.txt")));
        System.out.println(Arrays.deepToString(read("blabla.txt")));
    }

    public static void store(Object objs, String fn) throws IOException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fn))) {
            oos.writeObject(objs);
            oos.flush();
        }
    }

    public static <T> T read(String fn) throws IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fn))) {
            return (T) ois.readObject();
        }
    }
}
 
Vielen Dank für eure Antworten.
Ich hab es jetzt tatsächlich hinbekommen.

Nämlich indem ich meine doppelt-verschachtelte For-Schleife die ich als Testausgabe für mein String-Array angelegt hatte abgeändert habe und mir dort alle Werte dann mit Integer.parseInt() umgeändert habe.
Sowie alle "Null" in "0" geändert habe.
 
Der von dem Konrad beschriebene Ansatz wird dadurch aber nicht richtiger.
Neuer Account von Tobias?

Wenn etwas falsch ist, dann bitte sagen, was genau falsch ist.

Derzeit ist es eher so, dass Dein Ansatz komplett an dem vorbei geht, was der TE möchte. Wenn man den Code in #1 anschaut, dann geht es dem TE um das Einlesen einer csv Datei. Und in dem Text geht es dem TE darum, "die Datei" (Ja, also wirklich genau diese, die er da hat!) so einzulesen, dass er die Zahlen als Zahlen hat.

Damit gehen Deine Vorschläge ganz offensichtlich komplett am Thema vorbei. Und der TE hat - wie er klar schreibt - mit dem Hinweis sein Problem lösen können.
 
Zum CSV parsen nimmt man eine Library und versucht nicht selber es schlecht/falsch umzusetzen, wie dein kläglicher Versuch gezeigt hat.
Das ist so doch Kindergarten-Niveau. Mein Ratschlag hat dem TE geholfen, weiter zu kommen. Dein Code ist
  • ohne jede Erklärung nicht mehr wie Müll
  • geht an den Anforderungen des TE komplett vorbei (aber das sind wir ja gewohnt von Dir, Tobias. Das Erfassen von selbst einfachen Texten ist nun einmal nicht Deine Stärke!)

Aber Deine Kritik hier ist wieder ein Zeichen absoluter Ignoranz:
a) Gerade am Anfang schreibt man einiges, für das es ggf. bessere Lösungen gibt. So werden z.B. auch abstrakte Datentypen implementiert.
b) Für eine Datei, in der scheinbar nur pro Zeile zwei Zahlen stehen (durch Komma getrennt) eine große Library einzubinden, ist einfach nur unnötig und etwas, das ich als schlichten Unsinn bezeichnen würde.

Und wenn jemand hier Libraries suchen sollte:

Aber so es hier wirklich bei diesen einfachen Dateien bleibt, würde ich da nichts in der Form nutzen.

Wenn es etwas komplexer wird, neige ich übrigens dazu, meine eigenen Klassen zu schreiben. Meine Erfahrung mit csv Dateien sind extrem schlecht (und liegen zum Glück schon einige Jahre zurück). Da gibt es nun einmal keinen klaren Standard bzw. das, was dann irgendwann mal als Standard festgelegt wurde, kam viele Jahre nach dem Produkte wie Microsoft Office das Format "missbraucht" haben. Mein Ratschlag ist, dass man csv Dateien nie zum Datenaustausch nutzt, weil schlicht zu fehleranfällig. XML, JSON oder sogar einfaches Excel sind da deutlich besser.
Das Ganze könnte man ggf. bei einem neuen Thread tiefer diskutieren - aber hier im Thread ist es schlicht Off Topic und jede Reaktion auf Tobias ist auch eine Reaktion zu viel.
 
Tipp dann tue das doch das nechste mal auch. 🙂
Schone deine Nerven 🤔
Meine Nerven müssen da nicht geschont werden. Nur leider
  • gab es ja neue Punkte (Dein Hinweis bzgl csv Libraries)
  • sind gewisse Aussagen geeignet, Andere zu Irritieren. Der TE könnte meinen, dass seine Lösung tatsächlich falsch ist.

Die Antworten gehen daher weniger Richtung Tobias sondern mehr Richtung TE und allen Anderen, die über den Thread stolpern und hier dann lesen.

Wie Du ja in der Vergangenheit mitbekommen hast, habe ich eher ein Problem mit aus meiner Sicht falschen Aussagen im Forum.
 
Zum CSV parsen nimmt man eine Library und versucht nicht selber es schlecht/falsch umzusetzen, wie dein kläglicher Versuch gezeigt hat.
Einfach zu irgendwelchen Libs zu greifen kann ein gefährlicher Ansatz sein, s. Log4jShell. Man könnte sich ganz unnötig Probleme einhandeln und die Komplexität der Anwendung steigern. Natürlich muss man das Rad nicht neu erfinden aber so einfache Dinge kann man selbst lösen/lernen.
 
Natürlich muss man das Rad nicht neu erfinden aber so einfache Dinge kann man selbst lösen/lernen.

Als Erweiterung dazu, immer bei solchen Diskussionen wird der Satz "Erfinde das Rad nicht neu!" rausgeholt um fuer Bibliotheken zu argumentieren. Ich sehe es aber so, ich brauche ein Gummirad, kein Carbonrad mit Alufelgen auf einem Sportwagen. Oder schlimmer, ich haette gerne ein Holzrad, und nicht ein 27-kantiges-Platin-Rad welches aus 41 Teilen besteht und korrekt zusammen gesetzt werden muss vor der Verwendung. Eine Bibliothek nuetzt mir nur dann etwas wenn sie mir Arbeit abnimmt, und nicht mehr Arbeit macht. Dazu gehoert auch Wartbarkeit und Einarbeitungszeit, aber vorallem Wartbarkeit und Anpassbarkeit. Das ist etwas was viele immer gerne uebersehen.

Ein Beispiel dazu war mal ein kleines Projekt das ich verwenden wollte oder musste, hatte "nur" eine Abhaengigkeit, naemlich auf irgendeine riesige Commons-Bibliothek, weil der Author an einer Stelle nicht Map<String, Map<String, String>> machen wollte, sondern lieber so etwas wie GroupedMap<String, String, String>. Das war schon ziemlich krasses Beispiel weil dadurch relativ grosze Abhaeingkeiten dazu kamen. Die Aenderungen waren aber nur wenige Zeilen in dem Projekt um auf die Map umzustellen.
 
Eines möchte ich bei dieser Gelegenheit anbringen. Die eigene Sichtweise muss nicht immer die einzige sein. Den Eindruck bekommt man maschmal.
😉
Daher sind Argumente wichtig. Ich denke, dass ich diese durchaus bringe. Und natürlich gibt es viele Sichtweisen. Die Sichtweise von Tobias gibt es auch. Die Existenz eben dieser wurde von mir nie bestritten. Ich habe seine Sichtweise sogar am Anfang komplett ignoriert (weil halt schon der Verdacht bestand, dass es Tobias ist) und erst reagiert, als von ihm ohne jedes Argument etwas als falsch bezeichnet wurde, dass der TE als Lösung für sich bereits bestätigt hatte.

Das nur als kleiner Hinweis, damit hier nicht alles verdreht wird. Es ist ja nicht so, dass ich irgend etwas nicht als Möglichkeit einräume und darauf beharre … ich bringe lediglich meine Sichtweise und bin dabei bedacht, konstruktiv zu sein.
 

Zurück
Oben