2015-06-07 9 views
6

Ich möchte eine Textdatei lesen, die String und ein paar Ganzzahlen im Zusammenhang mit dieser Zeichenfolge hat.Ganzzahlige Daten aus TXT-Datei in Java

Dies ist die Klasse, die ich habe mein Programm in schreiben:

public List<Integer> Data(String name) throws IOException { 
    return null; 
} 

ich die TXT-Datei gelesen habe und den Namen in dieser Datei mit ihren Daten. Und speichern Sie es in einem ArrayList.

Meine Frage ist, wie kann ich es in der ArrayList<Integer> speichern, wenn ich String s in der List habe.
Dies ist, was ich denke, ich tun würde:

Scanner s = new Scanner(new File(filename)); 
ArrayList<Integer> data = new ArrayList<Integer>(); 

while (s.hasNextLine()) { 
    data.add(s.nextInt()); 
} 
s.close(); 
+2

Sie wollen String drehen integer zu? – Alexander

Antwort

3

Ich würde die Datei als Feld definieren (zusätzlich zu den filename, und ich schlage vor, es aus Anwender Home-Ordner zu lesen) file

private File file = new File(System.getProperty("user.home"), filename); 

Dann können Sie den Diamant-Operator <> verwenden, wenn Sie Ihre List definieren. Sie können eine try-with-resources zu close Ihre Scanner verwenden. Sie möchten nach Zeilen lesen. Und Sie können split Ihre line. Dann testen Sie, ob Ihre erste Spalte mit dem Namen übereinstimmt. Wenn dies der Fall ist, wiederholen Sie die anderen Spalten, um sie zu int zu analysieren. So etwas wie

public List<Integer> loadDataFor(String name) throws IOException { 
    List<Integer> data = new ArrayList<>(); 
    try (Scanner s = new Scanner(file)) { 
     while (s.hasNextLine()) { 
      String[] row = s.nextLine().split("\\s+"); 
      if (row[0].equalsIgnoreCase(name)) { 
       for (int i = 1; i < row.length; i++) { 
        data.add(Integer.parseInt(row[i])); 
       } 
      } 
     } 
    } 
    return data; 
} 

Es könnte signifanctly effizienter sein, die Datei einmal zu scannen und speichern Sie die Namen und Felder als Map<String, List<Integer>> wie

public static Map<String, List<Integer>> readFile(String filename) { 
    Map<String, List<Integer>> map = new HashMap<>(); 
    File file = new File(System.getProperty("user.home"), filename); 
    try (Scanner s = new Scanner(file)) { 
     while (s.hasNextLine()) { 
      String[] row = s.nextLine().split("\\s+"); 
      List<Integer> al = new ArrayList<>(); 
      for (int i = 1; i < row.length; i++) { 
       al.add(Integer.parseInt(row[i])); 
      } 
      map.put(row[0], al); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return map; 
} 

Dann speichern, dass als fileContents wie

private Map<String, List<Integer>> fileContents = readFile(filename); 

Und dann implementieren Sie Ihre loadDataFor(String) Methode mit fileContents wie

Wenn Ihr Verwendungsmuster die File für viele Namen liest, ist die zweite wahrscheinlich viel schneller.

0

Wenn Sie Java8 verwenden möchten, könnten Sie etwas wie das verwenden.

Eingabe.txt (hat in Classpath sein):

text1;4711;4712 
text2;42;43 

Der Code:

public class Main { 

    public static void main(String[] args) throws IOException, URISyntaxException { 

     // find file in classpath 
     Path path = Paths.get(ClassLoader.getSystemResource("input.txt").toURI()); 

     // find the matching line 
     findLineData(path, "text2") 

       // print each value as line to the console output 
       .forEach(System.out::println); 
    } 

    /** searches for a line in a textfile and returns the line's data */ 
    private static IntStream findLineData(Path path, String searchText) throws IOException { 

     // securely open the file in a "try" block and read all lines as stream 
     try (Stream<String> lines = Files.lines(path)) { 
      return lines 

        // split each line by a separator pattern (semicolon in this example) 
        .map(line -> line.split(";")) 

        // find the line, whiches first element matches the search criteria 
        .filter(data -> searchText.equals(data[0])) 

        // foreach match make a stream of all of the items 
        .map(data -> Arrays.stream(data) 

          // skip the first one (the string name) 
          .skip(1) 

          // parse all values from String to int 
          .mapToInt(Integer::parseInt)) 

        // return one match 
        .findAny().get(); 
     } 
    } 
} 

Der Ausgang:

42 
43 
Verwandte Themen