在Java

时间:2017-01-22 02:24:02

标签: java arrays

我目前正在开发一个程序,该程序读入预设的文本文件,然后以各种方式处理数据。我已经使用数据操作来处理一些虚拟数据,但我仍然需要正确读取文本文件。

测试文件如下所示为120行:

阿伯丁,苏格兰,57,9,N,2,9-,W,5:00,P.M。阿德莱德,澳大利亚,34,55,S,138,36,E,2:30,A.M。阿尔及利亚阿尔及尔,36,50,N,3,0,E,6:00,下午(等等)

所以每个都需要按照String[] CityNameString[] Countryint[] LatDegint[] LatMinString[] NorthSouth,{{ 1}},int[] LongDegint LongMinString[] EastWestint[] Time

所以问题在于,尽管我对缓冲读卡器感到相当舒服,但设计这个特定功能已经证明是困难的。事实上,过去几个小时我一直在画空白。看起来它需要多个循环和计数器,但我无法弄清楚究竟是如何。

4 个答案:

答案 0 :(得分:2)

我假设每个行类型的文件结构都有一个城市。如果不是,则需要在以下解决方案中进行一些调整:

如果我对BufferReader更熟悉,我会按照以下方式进行:

List<List<String>> addresses = new ArrayList<List<String>>();
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
    for(String line; (line = br.readLine()) != null; ) {
        addresses.add(line.split(","));
    }
}

稍后,假设您想要检索“Adelaid”的国家/地区信息,您可以尝试以下操作:

for (List<String> cityInfo : addresses) {
   if("Adelaid".equals(cityInfo.get(0)) {
      country = cityInfo.get(1);
   }
}

答案 1 :(得分:1)

尝试使用域对象,而不是创建不同的数组(如String [] CityName,String [] Country等)。

在这里,您可以拥有一个Domain对象或带有属性

的自定义类位置
    public class Location
    {
    private String cityName;
    private String country;
    private String latDeg;
    etc

    getters();
    setters();
    }`

然后你可以写一个文件阅读器,文件中的每个行项目都是一个位置。所以结果会有

    Location[] locations;

或         列出位置;`

答案 2 :(得分:-1)

将文件中的数据读入String变量,并使用String类的split()方法将数据分解为单个值。 (如果文件中的数据用逗号分隔,请将逗号传递给split()方法。

split()方法获得的值将是一个字符串数组。然后,您可以将数组值保存在相应的变量中。 CityName = array[0]; Country = array[1]; 其中 array 是声明为String的数组变量。

请注意,如果需要对它们执行计算,则必须将数值更改为Integer.parseInt(String)的整数。否则你可以将它们保留为字符串。

答案 3 :(得分:-1)

要执行此任务,我认为您要做的第一件事就是确定数据文件中实际存在多少行数据。你说它是120行,但如果它发生的话会更多或更少呢?我们想要确切地知道它是什么,以便正确初始化我们所有不同的数组。我们可以使用一种简单的方法来实现这一点,让我们将其称为 getFileLinesCount()方法,该方法将返回一个Integer值,该值将是数据文件保存的文本行数: / p>

private int getFileLinesCount(final String filePath) {
    int lines = 0;
    try{
        File file =new File(filePath);
        if(file.exists()){
            FileReader fr = new FileReader(file);
            try (LineNumberReader lnr = new LineNumberReader(fr)) {
                while (lnr.readLine() != null){ lines++; }
            }
        }
        else { 
            throw new IllegalArgumentException("GetFileLinesCount() Method Error!\n"
                    + "The supplied file path does not exist!\n(" + filePath + ")");
        }
    }
    catch(IOException e){ e.printStackTrace(); }
    return lines;
}

将此方法放在主类中的某个位置。现在你需要声明并初始化你的所有数组:

String filePath = "C:\\My Files\\MyDataFile.txt";
int lines = getFileLinesCount(filePath);
String[] CityName = new String[lines];
String[] Country = new String[lines];
int[] LatDeg = new int[lines];
int[] LatMin = new int[lines];
String[] NorthSouth = new String[lines];
int[] LongDeg = new int[lines];
int[] LongMin = new int[lines];
String[] EastWest = new String[lines];
int[] Time = new int[lines];
String[] AMPM = new String[lines];

现在填写所有这些数组:

public static void main(String args[]) {
    loadUpArrays();

    // Do whatever you want to do 
    // with all those Arrays.....
}

private void loadUpArrays() {
    // Read in the data file.
    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
        String sCurrentLine;
        int x = 0;

        // Read in one line at a time and Fill the Arrays...
        while ((sCurrentLine = br.readLine()) != null) {
             // Split each line read into an array upon itself.
    String[] fileLine = sCurrentLine.split(",");

             // Fill our required Arrays...
             CityName[x] = fileLine[0];
             Country[x] = fileLine[1];
             LatDeg[x] = Integer.parseInt(fileLine[2]);
             LatMin[x] = Integer.parseInt(fileLine[3]);
             NorthSouth[x] = fileLine[4];
             LongDeg[x] = Integer.parseInt(fileLine[5]);
             LongMin[x] = Integer.parseInt(fileLine[6]);
             EastWest[x] = fileLine[7];
             Time[x] = Integer.parseInt(fileLine[8]);
             AMPM[x] = fileLine[9];
             x++;
        }
        br.close();
    } 
    catch (IOException ex) { ex.printStackTrace(); } 
}

现在,我还没有对此进行测试,我只是快速打了一针,但我认为你可以开玩笑吧。

修改

由于 @Mad Physicist 在下面的评论中如此慷慨地指出,可以使用List来消除计算文件行的需要,因此无需两次读取数据文件。所有文件行都可以放入List中,有效文件行的数量可以通过List的大小来确定。现在也可以通过迭代List元素并相应地处理数据来实现所需数组的填充。一切都可以通过我们称之为 fillArrays()的单一方法来实现。你的Arrays声明会有所不同:

String[] CityName;
String[] Country;
int[] LatDeg;
int[] LatMin;
String[] NorthSouth;
int[] LongDeg;
int[] LongMin;
String[] EastWest;
String[] Time;
String[] AMPM;    

public static void main(String args[]) {
    fillArrays("C:\\My Files\\MyDataFile.txt");

    // Whatever you want to do with all 
    // those Arrays...
} 

private void fillArrays(final String filePath) {
    List<String> fileLinesList = new ArrayList<>();
    try{
        File file = new File(filePath);
        if(file.exists()){
            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                String strg;
                while((strg = br.readLine()) != null){
                    // Make sure there is no blank line. If not
                    // then add line to List.
                    if (!strg.equals("")) { fileLinesList.add(strg); }
                }
                br.close();
            }
        }
        else { 
            throw new IllegalArgumentException("GetFileLinesCount() Method Error!\n"
                    + "The supplied file path does not exist!\n(" + filePath + ")");
        }

        // Initialize all the Arrays...
        int lines = fileLinesList.size();
        CityName = new String[lines];
        Country = new String[lines];
        LatDeg = new int[lines];
        LatMin = new int[lines];
        NorthSouth = new String[lines];
        LongDeg = new int[lines];
        LongMin = new int[lines];
        EastWest = new String[lines];
        Time = new String[lines];
        AMPM = new String[lines];

        // Fill all the Arrays...
        for (int i = 0; i < fileLinesList.size(); i++) {
            String[] lineArray = fileLinesList.get(i).split(",");
            CityName[i] = lineArray[0];
            Country[i] = lineArray[1];
            LatDeg[i] = Integer.parseInt(lineArray[2]);
            LatMin[i] = Integer.parseInt(lineArray[3]);
            NorthSouth[i] = lineArray[4];
            LongDeg[i] = Integer.parseInt(lineArray[5]);
            LongMin[i] = Integer.parseInt(lineArray[6]);
            EastWest[i] = lineArray[7];
            Time[i] = lineArray[8];
            AMPM[i] = lineArray[9];
        }
    }
    catch(IOException e){ e.printStackTrace(); }
}  

另一个注意事项......你的时间数组不能是整数,因为在数据中,时间包含冒号(:)这是一个字母字符(因为你没有注意到)我有将其声明更改为String []