Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern

JavaUndC-Prog

Bekanntes Mitglied
Hallo,
ich bin dabei eine große Funktion umzusetzen u.a. benötige ich dafür eine Funktion, die mir eine TXT Datei einliest und in eine Arrayliste abspeichert. In der TXT steht mehrzeilig sowas wie 2,3 5,5 ... Zahlen eben... Mein Code steht auch schon nur bin ich wieder auf der suche nach einer optimalen Umsetzung, also nehme ich Kritik am Code gerne an. Ich suche also eine Code Korrektur, oder Vorschläge zur Verbesserung:
Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Tester {
  
    static ArrayList<Double> test = new ArrayList<Double>();
  
    public static void main(String[] args) {
        try {
              File file = new File("dat.txt");
              Scanner scanner = new Scanner(file);

              while (scanner.hasNextLine()){
                String line = scanner.nextLine();
                System.out.println("Txt: " + line);
                stringSplitter(line);
              }
              scanner.close();
            } catch (FileNotFoundException e) {
              e.printStackTrace();
            }
      
      
        for(int i = 0; i < test.size(); i++) {
            System.out.println("Arr: " + test.get(i));
        }
    }
  
    private static void stringSplitter(String line) {
        String[] parts = line.replaceAll(",", ".").split(" ");
        for(int i = 0; i < parts.length; i++) {          
            test.add(Double.parseDouble(parts[i]));
        }
    }
}
 
Hi,
wenn du schon gemecker willst, mache ich es gerne 😉

Das was mir sofort ins Auge fällt, ist der Klassenname "Tester", die Variablenbezeichnung "test" und der Methodenname "stringSplitter". Wenn du dein Programm in einem halben Jahr öffnest, wirst du bereits über diesen Namen stolpern und alles nochmal durchlesen müssen. Solltest du die Klasse in einem großen Programm verwenden, wirst du noch größere Probleme haben.

Deine Klasse soll dafür zuständig sein, einen String zu splitten? Dann nenne sie lieber
Code:
StringSplitter
und die Methode stattdessen
Code:
splitString(String stringToSplit)

Da du den String auch noch als eine Liste speichern willst, würde ich sogar so etwas wie
Code:
private static ArrayList<Double> convertStringToList(String stringToConvert)
vorschlagen. Diese Methode würde dann auch die Liste zurückgeben, statt sie still und heimlich zu ändern.

Die Variable "test" solltest du ganz dringen umbenennen, am besten in das, was es im späteren Programmverlauf darstellen soll. Von sowas wie "arrayList" würde ich dringend abraten.


Wenn das eine größere Funktion ist und du ohnehin in Java programmierst, würde sich Objektorientierung anbieten. Da kann ich aber nicht mehr dazu sagen, weil ich deinen bisherigen Kenntnissstand diesbezüglich nicht kenne und dich somit evtl. nur verwirren könnte.
 
Wenn du schon einen Scanner verwendest, dann kannst du dem die richtige Locale mitgeben und er parst dir richtig die Zahlen (bei uns eben DE). Dann sieht das auch einfach so aus:
Java:
public static List<Double> readDoubles(File file, Locale locale) throws FileNotFoundException {
  try(Scanner scanner = new Scanner(file)) {
    scanner.useLocale(locale);
    List<Double> doubles = new ArrayList<>();
    while(scanner.hasNextDouble()) {
      doubles.add(scanner.nextDouble());
    }
    return doubles;
  }
}
Sollte dann mit
Java:
List<Double> doubles = readDoubles(new File("test.txt"), Locale.GERMAN);
aufgerufen werden.
 
Zuletzt bearbeitet:
Danke für eure Vorschläge!

Ja die Benennung ist (noch) ungünstig 🙂 Das muss ich auf jedenfall noch anpacken!

Wenn du schon einen Scanner verwendest, dann kannst du dem die richtige Locale mitgeben und er parst dir richtig die Zahlen (bei uns eben DE). Dann sieht das auch einfach so aus:
Java:
public static List<Double> readDoubles(File file, Locale locale) throws FileNotFoundException {
  try(Scanner scanner = new Scanner(file)) {
    scanner.useLocale(locale);
    List<Double> doubles = new ArrayList<>();
    while(scanner.hasNextDouble()) {
      doubles.add(scanner.nextDouble());
    }
    return doubles;
  }
}
Sollte dann mit
Java:
List<Double> doubles = readDoubles(new File("test.txt"), Locale.GERMAN);
aufgerufen werden.

Das ist natürlich eine gute Idee! Erstaunlich kurz 🙂
 

Zurück
Oben