2017-11-13 3 views
0

Ich habe diese Textdatei und ich muss sie in ein Java-Programm extrahieren, um Arraygrößen und ihre Werte zu bestimmen. Ich kann jede Zeile lesen, aber ich kann den Wert nicht bekommen für Linien, die viele Zahlen enthalten. Plus, wie Element in der dritten Zeile zählen (0 2)Wie man das aus der Datei liest und jeden Wert allein erhält

4 
5 
0 2 

0 1 0.6 
0 2 0.2 
0 3 0.5 
1 3 0.8 
2 3 0.3 

diesen Code, ich verwende.

List<Integer> list = new ArrayList<Integer>(); 
     File file = new File("D:\\ALGORTHIMS\\MASTER LEVEL\\dr. khaled\\assignment 1\\text.txt"); 
     BufferedReader reader = null; 
     List<Double> ints = new ArrayList<Double>(); 

     try { 
      reader = new BufferedReader(new FileReader(file)); 
      String text = null; 

      while ((text = reader.readLine()) != null) { 
       if (text.length() == 1) { 
        list.add(Integer.parseInt(text)); 
       } else { 


        String[] strs = text.trim().split("\\s+"); 


        for (int i = 0; i < strs.length; i++) { 
         ints.add(Double.parseDouble(strs[i])); 
        } 
       } 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 

      } 
     } 

//print out the list 
     System.out.println(list); 

     System.out.println(ints); 
+1

'Integer.parseInt (Text)' wird nicht funktionieren, weil Sie 'float' Zahlen in der Datei haben. Verwenden Sie 'text.split (" \\ s + ")', um die Zahl nach dem Leerzeichen zu teilen. –

+0

Es funktioniert nicht, überprüfe meine Updates – SubhiMMM

Antwort

0

Probieren Sie etwas wie

public static void main(String[] args) { 
     List<Double> list = new ArrayList<>(); 
     File file = new File("text.txt"); 
     BufferedReader reader = null; 

     try { 
      reader = new BufferedReader(new FileReader(file)); 
      String text = null; 

      while ((text = reader.readLine()) != null) { 
       String[] str = text.split(" "); 
       for (int i = 0; i<str.length; i++) { 
        if(str[i].trim().length() > 0) { 
         list.add(Double.parseDouble(str[i])); 
        } 
       } 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       System.out.print(e); 
      } 
     } 

//print out the list 
     System.out.println(list); 
    } 
+0

'Double.parseDouble (str [i])' ist plattformspezifisch und unterstützt nicht 'Locale'. Daher könnten Sie eine Ausnahme auf verschiedenen Laptops haben. –

0

Es sieht aus wie Sie verdoppelt verwenden, gemischt mit int so Integer.parseInt() wird nicht arbeiten.

Was Sie tun könnten, ist split die Linie, getrennt durch ein Leerzeichen in eine array, und setzen Sie jedes dieser Elemente in list. Beachten Sie, dass 0 als 0.0 gedruckt wird.

while ((text = reader.readLine()) != null) { 
     String[] numbers = text.split(" "); 
     for (String number : numbers) { 
      list.add(Double.valueOf(number)); 
     } 
} 

Auch haben Sie kopieren Sie einfach this Antwort für Ihren Code?

0

denke ich, dass Scanner mit optimale Lösung ist. Zum Beispiel falls wir Datei

haben
4 5 

0 1 2 3.1 
4 5 6 7.2 
8 9 10 11.3 
12 13 14 15.4 
16 17 18 19.5 

wo wir ein Array mit 4 Zeilen und 5 Spalten definieren. Dann bekommen sie in int[][] arr könnten wir folgenden Ansatz verwenden:

public static void main(String... args) throws FileNotFoundException { 
    double[][] arr = null; 

    try (Scanner scan = new Scanner(new FileInputStream(new File("text.txt")))) { 
     scan.useLocale(Locale.US); // to use '.' as separator 
     int rows = scan.nextInt(); 
     int columns = scan.nextInt(); 
     scan.nextLine(); 

     arr = new double[rows][columns]; 

     for (int i = 0; i < rows; i++) 
      for (int j = 0; j < columns; j++) 
       arr[i][j] = scan.nextDouble(); 
    } 

    System.out.println(Arrays.toString(arr)); 
} 
0

Sie java.util.scanner können verschiedene Datentypen aus einem Strom relativ schmerzlos zu analysieren.

Beispiel: Angenommen, Sie folgendes analysieren wollten:

1 2 3.0 
4.0 5 6 

Sie können verwenden Sie den folgenden Code-Schnipsel:

Scanner scan = new Scanner(System.in); 
int one = scan.nextInt(); 
int two = scan.nextInt(); 
double three = scan.nextDouble(); 
// Defaultly, it will continue past the line break 
double four = scan.nextDouble(); 

// We can also do this 
double five = scan.nextDouble(); 
long six = scan.nextLong(); 

Ein wichtiger Hinweis ist, dass java.util.Scanner unterdrücken IOException s (obwohl Ausnahmen von der Konvertierung von Text, zB NumberFormatException s, wird immer noch erhöht). Sie können ioException überprüfen, um zu sehen, ob eines unterdrückt wurde.

Verwandte Themen