В то время как проблема петли для читателя файла? - PullRequest
1 голос
/ 25 марта 2012

Я создаю программу для класса, которая читает в файле CSV и выполняет различные математические уравнения с данными, приведенными в файле. Файл CSV находится в настройке:

  • долгота1, широта1, timeStamp1
  • долгота2, широта2, отметка времени2
  • долгота3, широта3, отметка времени3

(и это продолжается примерно для 100 различных координат).

Сейчас я сосредотачиваюсь на значениях долготы - мне трудно заставить цикл while выполнять операции, которые мне тоже нужны. Мне нужно иметь возможность заставить программу вычитать longitude2 из longitude1 (где lon1 и lon2 меняются по мере прохождения цикла ... в конечном счете, проходя через каждую координату).

Проблема, с которой я столкнулся, заключается в том, что цикл не создает «перекрытия» (из-за отсутствия лучшего термина). Он выполняет математику для первых двух координат, а затем пропускает до следующих двух ... таким образом, пропуская все остальные операции.

[то есть: цикл выполняет: lon2 - lon1 и lon4-lon3, но пропускает lon3-lon2]

У меня есть догадка, что моя проблема лежит в начале цикла while, но я, честно говоря, не знаю, как это исправить. Я хотел бы помочь. Ниже приведен код, который у меня есть:

import java.io.*;
import java.util.*;
public class SearchAndR {
    public static void main(String[] args) throws FileNotFoundException {
        // creates a Scanner called "keyboard" to read in the file name
        Scanner keyboard = new Scanner(System.in);
        // prompts user for file name
        System.out.println("Enter the name of the file you intend to read in");
        // Stores file name as a string so that we may read it in
        String file = keyboard.nextLine();
        // creates a new Scanner called fr(short for filereader) so we can read
        // in the file
        // then we create a File object using the constructor new with the class
        // "File"
        // this takes in our string "file" as a parameter to read it in
        // reading in our file object to the scanner
        Scanner fr = new Scanner(new File(file));
        // Creating format for hike1.csv file
        System.out.println("--- Hike Analysis ---");
        System.out.println("File: " + file);
        // Calling HW4 Class to use in the rest of the program
        HW4Util util = new HW4Util();
        // Establishing counting variable for distance for the while loop
        double totaldistance = 0;
        while (fr.hasNextLine()) {
            String line = fr.nextLine();
            String[] stamp1 = line.split(",");
            String line2 = fr.nextLine();
            String[] stamp2 = line2.split(",");
            double lon1 = Double.parseDouble(stamp1[0]);
            double lat1 = Double.parseDouble(stamp1[1]);
            String time1 = (stamp1[2]);
            double lon2 = Double.parseDouble(stamp2[0]);
            double lat2 = Double.parseDouble(stamp2[1]);
            String time2 = (stamp2[2]);
            // This is just to check to see if the overlap is occurring!
            // This should not be included in the project. 
            System.out.println("this is longitude" +lon1);
            System.out.println("this is longitude" +lon2);
            // returns the distance between two coordinates as a fraction of a
            // mile
            double dist = util.distance(lat1, lon1, lat2, lon2);
            totaldistance = totaldistance + dist;
            totaldistance = (double) (Math.round(totaldistance * 10000)) / 10000;
        }
        System.out.println("Total distance traveled: " + totaldistance + " miles");
   } // end method main
} // end class filereader

1 Ответ

3 голосов
/ 25 марта 2012

Это потому, что вы читаете 2 строки за один цикл.Я бы посоветовал сделать что-то вроде этого:

String previousLine;
String[] previousStamp;
if (fr.hasNextLine())
{
   previousLine = fr.nextLine();
   previousStamp = previousLine.split(",");
}
while (fr.hasNextLine()) {
    String currentLine = fr.nextLine();
    String[] currentStamp = line.split(",");

    //do your math here
    //...

    //swap values
    previousStamp = currentStamp;
}

Почему это не работает так, как вы хотели?Что ж, представьте себе указатель, который находится в начале вашего файла.С помощью fr.nextLine () вы читаете строку, которая в данный момент указана, а указатель опускается.В одном цикле цикла вы читаете 2 последовательные строки, выполняете математику, а в следующем цикле снова читаете еще 2 строки

...