2013-10-13 3 views
2

Может ли кто-нибудь показать мне базовое руководство, как это сделать? Вы бы использовали Array или ArrayList и почему? Все, что я нашел в Интернете, слишком сложно понять для моего уровня опыта работы с Java. Файл представляет собой простой текстовый файл с семью десятичными значениями в строке и содержит три строки. Вот что я до сих пор, и просто проверяю его, чтобы проверить, правильно ли я делаю ArrayList. Он продолжает печатать пустой ArrayList, который является всего лишь двумя скобками.Чтение номеров из текстового файла в ArrayList в Java

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class SalesAnalysis 
{ 
    public static void main (String[] args) throws FileNotFoundException 
    { 

     Scanner salesDataFile = new Scanner(new File("SalesData.txt")); 

     ArrayList<Double> salesData = new ArrayList<Double>(); 

     while(salesDataFile.hasNextDouble()) 
     { 
      salesData.add(salesDataFile.nextDouble()); 
     } 
     salesDataFile.close(); 

     System.out.println(salesData); 

    } 
} 
+1

Это выглядит хорошо для меня. Если вы не знаете размер файла, то использование 'ArrayList' является более подходящим, поскольку оно может расширяться/сокращаться динамически, тогда как' Array' не может. –

+0

Не могли бы вы рассказать мне, почему мой вывод представляет собой пустую пару скобок, тогда, если код выглядит нормально? Кроме того, мне нужно выполнить вычисления на числах в каждой строке, как бы это сделать с помощью ArrayList, потому что я предполагаю, что он помещает все числа в каждую строку в один большой список? –

+0

Что такое файл SalesData.txt? Вставьте его здесь. – UDPLover

ответ

5
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class SalesAnalysis 
{ 
    public static void main (String[] args) throws FileNotFoundException 
    { 

     Scanner salesDataFile = new Scanner(new File("SalesData.txt")); 

     ArrayList<Double> salesData = new ArrayList<Double>(); 

     while(salesDataFile.hasNextLine()){ 
      String line = salesDataFile.nextLine(); 

      Scanner scanner = new Scanner(line); 
      scanner.useDelimiter(","); 
      while(scanner.hasNextDouble()){ 
       salesData.add(scanner.nextDouble()); 
      } 
      scanner.close(); 
     } 

     salesDataFile.close(); 

     System.out.println(salesData); 
    } 
} 

прочитанной строку из файла, то для каждого файл, получит в два раз с помощью сканера.

И на основе линии, вы можете просто создать списки для каждой строки, как:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class SalesAnalysis 
{ 
    public static void main (String[] args) throws FileNotFoundException 
    { 

     Scanner salesDataFile = new Scanner(new File("SalesData.txt")); 

     while(salesDataFile.hasNextLine()){ 
      String line = salesDataFile.nextLine(); 

      ArrayList<Double> salesData = new ArrayList<Double>(); 

      Scanner scanner = new Scanner(line); 
      scanner.useDelimiter(","); 
      while(scanner.hasNextDouble()){ 
       salesData.add(scanner.nextDouble()); 
      } 
      scanner.close(); 

      System.out.println(salesData); 
     } 

     salesDataFile.close(); 

    } 
} 

Как вы получаете за значения строк внутри первого While() цикл, вы можете делать все, что с линией.

 // number of values in file 
     int totalNumValues = 0; 
     // total sum 
     double totalSum = 0; 

     while(salesDataFile.hasNextLine()){ 
      String line = salesDataFile.nextLine(); 

      ArrayList<Double> salesData = new ArrayList<Double>(); 

      // total values in this line 
      int numValuesInLine = 0; 
      // sum in this line 
      double sumLine = 0; 

      Scanner scanner = new Scanner(line); 
      scanner.useDelimiter(","); 
      while(scanner.hasNextDouble()){ 
        double value = scanner.nextDouble(); 
        sumLine = sumLine + value; 
        numValuesInLine++; 
        totalNumValues++; 
        totalSum = totalSum + value; 
      } 
      scanner.close(); 

      System.out.println(salesData); 
     } 
+0

Как он собирается выполнять вычисления в ряд с этим решением? Он не сможет отличить, какое число принадлежит той строке. –

+0

При выполнении этого вывода выводятся только первые шесть номеров из первой. Кроме того, что @Esteban сказал, как я буду выполнять вычисления на строку? Нужно ли создавать три отдельных массива? –

+0

Пожалуйста, прочитайте обновленный ответ, я думаю, что это назначение на сканере, поэтому используйте сканер для получения строк из файла, а затем используйте больше сканера, чтобы получить двойные значения из строки, считанной из файла. – UDPLover

0

Как сказал @Justin Jasmann, у вас есть значения, разделенные запятыми, так что технически они больше, чем просто double ценности, почему бы не читать их в строку, а затем анализировать их с помощью Double.parseDouble(String s) после у вас есть запятая значение separatad с помощью string.split(","); на каждой линии.

0

Это то, что вы ищете,

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.text.NumberFormat; 
import java.text.ParseException; 
import java.text.ParsePosition; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Locale; 


public class FileRead { 


    public static void main(String args[]) 
    { 
     try{ 
      // Open the file that is the first 
      FileInputStream fstream = new FileInputStream("textfile.txt"); 

      // Use DataInputStream to read binary NOT text. 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 

      String strLine; 
      List<Double> saleNumbers= new ArrayList<Double>(); 

      //Read File Line By Line 
      while ((strLine = br.readLine()) != null) { 
       // Add number from file to list 
       saleNumbers.add(parseDecimal(strLine)); 
      } 
      //Close the input stream 
      in.close(); 

      System.out.println(saleNumbers); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 



    public static double parseDecimal(String input) throws NullPointerException, ParseException{ 
      if(input == null){ 
      throw new NullPointerException(); 
      } 

      input = input.trim(); 

      NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.US); 
      ParsePosition parsePosition = new ParsePosition(0); 
      Number number = numberFormat.parse(input, parsePosition); 

      if(parsePosition.getIndex() != input.length()){ 
      throw new ParseException("Invalid input", parsePosition.getIndex()); 
      } 

      return number.doubleValue(); 
     } 
} 
+0

Это вызовет 'NumberFormatException', поскольку в строке есть/может быть несколько чисел. –

+0

справедливо сказал Джастин, однако, как упоминалось акселем «Файл представляет собой простой текстовый файл с семью десятичными значениями в строке и содержит три строки», этот код должен работать. –

+0

Да, разделенные запятыми. Вы можете попробовать свое решение. –

1

Я хотел бы сделать что-то вроде этого:

Scanner salesDataFile = new Scanner(new File("SalesData.txt")); 

    ArrayList<ArrayList<double> > salesData = new ArrayList<>(); 

    while(salesDataFile.hasNextLine()) 
    { 
     String stringOfNumbers[] = salesDataFile.nextLine().split(","); 
     ArrayList<double> aux = new ArrayList<>(stringOfNumbers.length); 
     for(int i = 0; i < stringOfNumbers.length; ++i) 
      aux.get(i) = Double.parseDouble(stringOfNumbers[i]); 
     //... Perform your row calculations ... 
     salesData.add(aux); 
    } 
    salesDataFile.close(); 

    System.out.println(salesData); 
+0

Я получаю эту ошибку компилятора при выполнении кода: 'Исключение в потоке«главный»java.lang.Error: Нерешенные проблемы компиляции: \t Метод nextLine() не определено для типа ArrayList > \t Синтаксическая ошибка на токене «двойной», размеры, ожидаемые после этого токена \t at SalesAnalysis.main (SalesAnalysis.java:18) ' –

+0

сделайте его разделенным на«, »вместо«; ». – Xantix

+0

Прошу прощения. Я ошибочно назвал переменную. Я редактировал код. Можете попробовать еще раз? –

Смежные вопросы