0

我无法将从文件中读取的文本放入数组列表中。

我的文字如下所示:

438;MIA;JFK;10:55;1092;447
638;JFK;MIA;19:45;1092;447
689;ATL;DFW;12:50;732;448 etc...

我的代码如下所示:

package filesexample;
import java.io.*;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;
/**
*
* @author 
*/
public class FilesExample {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {

    File file = new File ("/Schedule.txt");

    try
    {
        Scanner scanner= new Scanner(file);;

        while (scanner.hasNextLine())
        {
            String line = scanner.nextLine();
            Scanner lineScanner= new Scanner(line);
            lineScanner.useDelimiter(";");
            while(lineScanner.hasNext()){
            String part = lineScanner.next();
            System.out.print(part + " ");
        }

          System.out.println();          




        }

    }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }
}

非常感谢您对入门的一些帮助,谢谢!

4

4 回答 4

0

您不需要执行以下操作

Scanner lineScanner= new Scanner(line);
lineScanner.useDelimiter(";");

做就是了

String[] parts = line.split(";");
于 2012-11-14T20:06:09.090 回答
0

使用String.split(delimiter)分割你的字符串。

List<String> list = new ArrayList<String>();
    while (scanner.hasNextLine())
            {
                String line = scanner.nextLine();
                String[] strArr = line.split(";");
                for(String s: strArr){
                 list.add(s); //adding a string into the list
                 System.out.println(s +  " ");
                }
                }

              System.out.println();     

编辑:根据您的评论

在我发布的文字中,第一个数字是航班号、出发地、目的地、时间、里程和价格。他们都需要每个类别都有自己的数组,所以航班号需要自己的数组,起源自己的数组等。

您不需要每个属性的数组。创建一个类并将其命名为Filght。并将您的属性设为实例变量。

class Flight {
private long filghtNo;
private String origin;
private dest;
private Date time;
private long miles;
private double price;
//setters and getters
}

   List<Flight> list = new ArrayList<Flight>();
    Flight flight = new Flight();
    while (scanner.hasNextLine())
            {
                String line = scanner.nextLine();
                Scanner scan = new Scanner(line);
                if(scan.hasNextLong()){
                 flight.setFilgthNo(scan.nextlong());
                  }
                else if // do the  same for other properties
                }

     list.add(flight);

这种方式更加面向对象

于 2012-11-14T20:06:37.200 回答
0

他们都需要每个类别都有自己的数组,所以航班号需要自己的数组,起源自己的数组

我会说,不要。您不需要为它们中的每一个设置单独的数组。

我宁愿创建一个class带有属性的: - flight number, origin, destination, time, miles and price

现在对于每一行,我只需将其拆分为;,并在类中有一个以数组作为参数的构造函数。而不是ArrayList为每个参数单独设置,我将拥有一个ArrayList该类实例。

class Flight {
    private int flightNumber;
    private String origin;
    private String destination;
    ... so on for `time, miles and price`

    public Flight(String[] attr) {
        this.flightNumber = Integer.parseInt(attr[0]);
        this.origin = attr[1];
        this.destination = attr[2];
        ... so on.
    }
}

然后你在哪里使用: -

Scanner lineScanner = new Scanner(line);
lineScanner.useDelimiter(";");

我会String#split()用来获取单个属性,然后创建一个ArrayList<Flight>, 并向其中添加Flight实例:-

List<Flight> flights = new ArrayList<Flight>();

while (scanner.hasNextLine()) {
     String line = scanner.nextLine();
     String[] attributes = line.split(";");
     flights.add(new Flight(attributes));
} 

笔记 : -

您可以改进实例化Flight类的方式以及设置不同属性的方式。由于您的属性属于不同类型,并且它们位于 中String form,因此您需要使用适当conversion的 fromString to IntegerString to double我在这里没有考虑过的。

于 2012-11-14T20:13:34.727 回答
0

我重申需要更多面向对象的方法,但这就是您所需要的。

public final class FlightInfoParser {

  private static final String[] EMPTY_STRING_ARRAY = new String[]{};

  public static void main(String[] args) throws IOException {
    BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

    List<String> flightNumbersList = new ArrayList<String>();
    List<String> originsList = new ArrayList<String>();
    List<String> destinationsList = new ArrayList<String>();
    List<String> departureTimesList = new ArrayList<String>();
    List<Integer> milesList = new ArrayList<Integer>();
    List<Double> pricesList = new ArrayList<Double>();

    String line;
    while ((line = r.readLine()) != null) {
        String[] fields = line.split(";");
        flightNumbersList.add(fields[0]);
        originsList.add(fields[1]);
        destinationsList.add(fields[2]);
        departureTimesList.add(fields[3]);
        milesList.add(Integer.parseInt(fields[4]));
        pricesList.add(Double.parseDouble(fields[5]));
    }

    String[] flightNumbersArray = flightNumbersList.toArray(EMPTY_STRING_ARRAY);
    String[] originsArray = originsList.toArray(EMPTY_STRING_ARRAY);
    String[] destinationsArray = destinationsList.toArray(EMPTY_STRING_ARRAY);
    String[] departureTimesArray = departureTimesList.toArray(EMPTY_STRING_ARRAY);

    int[] milesArray = new int[milesList.size()];
    for (int i = 0, len = milesArray.length; i < len; ++i) {
        milesArray[i] = milesList.get(i);
    }

    double[] pricesArray = new double[pricesList.size()];
    for (int i = 0, len = pricesArray.length; i < len; ++i) {
        pricesArray[i] = pricesList.get(i);
    }

  }

}
于 2012-11-14T22:57:05.860 回答