Невозможно правильно проанализировать истинное ложное значение - PullRequest
1 голос
/ 20 июня 2020

Я практикую парсинг данных из CSV-файла, но обнаружил странность, когда проанализировал истинное и ложное значение на основе строки.

  1. green → true
  2. red → false

Я пробовал использовать все green в трех наборах данных, но оказалось false, false, true. Меня это сбивает с толку. Любая помощь, предположение или подсказка приветствуются.

Вот мой код синтаксического анализа:

    public void loadCsv() throws IOException {        
    String csvFile = "config.csv";
    String line = "";
    String csvSplit = "\\s*,\\s*";

    Character character = null;
    try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
        String headerLine = csvReader.readLine(); //get rid of the header
        //add each line to the arrayList
        while ((line = csvReader.readLine()) != null) { 
            csvContents.add(line);   
        }

        for(String csvLine : csvContents) {                
            String[] data = csvLine.split(csvSplit); // split by comma and remove redundant spaces                
            String clazz = data[0].toLowerCase();// cannot use word "class" as a variable

            // parsing the data and check validness of data
            try {
                if (clazz.startsWith("scenario") && data.length == 1) {
                    // adding scenario after one set of data
                    // i.e second round adding the first round data
                    if (passengers.size() != 0 && pedestrians.size() != 0) {
                        Scenario scenario = new Scenario();
                        scenario.setPassengers(passengers);
                        scenario.setPedestrians(pedestrians);
                        scenarios.add(scenario);
                    }
                    // create new arraylist for based on the same arrayList
                    // for different referencing, or it will be always
                    // the same data in total
                    passengers = new ArrayList<Character>();
                    pedestrians = new ArrayList<Character>();

                    if (clazz.equals("scenario:green")) { // could be wrong here
                        lineCount++ ;
                        scenario.setLegalCrossing(true);
                    }

                    else if (clazz.equals("scenario:red")){ // could be wrong as well
                        lineCount++ ;
                        scenario.setLegalCrossing(false);                          
                    }     
                    continue;
                }

                if (data.length == NO_OF_FIELDS) { 
                // adding person and animal
                // to passengers and pedestrians
                    ...
                } else {
                    lineCount++;
                    throw new InvalidDataFormatException();                    
                }
            } catch (InvalidDataFormatException e) {           
                System.out.println("WARNING: invalid data format in config file in line " + lineCount);                   
            }             
        }
        //add the last round data
        scenario.setPassengers(passengers);
        scenario.setPedestrians(pedestrians);
        scenarios.add(scenario);

        scenario.setPassengers(passengers);
        scenario.setPedestrians(pedestrians);
     }

Вот часть моего Scenario класса:

public class Scenario {

private Random random;

private ArrayList<Character> passenagers = new ArrayList<Character>();
private ArrayList<Character> pedestrians = new ArrayList<Character>();

private boolean legalCrossing;
private boolean hasYouInCar;
private boolean hasYouInLane;


public Scenario() {

}

public Scenario(ArrayList<Character> passengers, ArrayList<Character> pedestrians, boolean legalCrossing) {
    this.passenagers = passengers;
    this.pedestrians = pedestrians;
    this.legalCrossing = legalCrossing;
}

public void setLegalCrossing(boolean legalCrossing) {
    this.legalCrossing = legalCrossing;
}

public boolean getLegalCrossing () {
    return legalCrossing;
}

РЕДАКТИРОВАТЬ: Файл выглядит следующим образом:

The file looks like this:

  [0],    [1], [2],    [3]  ,    [4]    ,   [5]   ,  [6] ,   [7]  ,  [8] , [9]
class, gender, age, bodyType, profession, pregnant, isYou ,species, isPet, role
scenario:green,   ,         ,           ,         ,        ,      ,      ,
person, female, 24, average ,           , FALSE   ,        ,      ,      , passenger
animal, male  ,  4,         ,           , FALSE   ,        , dog  , TRUE , pedestrian
scenario:red
person, male  , 16, athletic, boxer     , FALSE   ,  TRUE  ,      ,      , passenger
person, female, 25, athletic, doctor    , TRUE    ,  FALSE ,      ,      , pedestrian

Тест с использованием System.out.println ("@@" + clazz + "@@");

@@scenario:green@@
@@person@@
@@person@@
@@person@@
@@person@@
@@person@@
@@person@@
@@animal@@
@@scenario:green@@
@@animal@@
@@animal@@
@@person@@
@@person@@
@@person@@
@@person@@
@@scenario:green@@
@@person@@
@@person@@
@@person@@
@@person@@
@@person@@
@@person@@

1 Ответ

0 голосов
/ 20 июня 2020

Это проблема ссылки из-за неправильного создания экземпляра. Вы можете видеть, что экземпляр Scenario scenario = new Scenario() приводит к неправильной ссылке, которую необходимо изменить на scenario = new Scenario(), чтобы создать другой объект в al oop, иначе он будет указывать на тот же объект.

public void loadCsv() throws IOException {        
String csvFile = "config.csv";
String line = "";
String csvSplit = "\\s*,\\s*";

Character character = null;
try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
    String headerLine = csvReader.readLine(); //get rid of the header
    //add each line to the arrayList
    while ((line = csvReader.readLine()) != null) { 
        csvContents.add(line);   
    }

    for(String csvLine : csvContents) {                
        String[] data = csvLine.split(csvSplit); // split by comma and remove redundant spaces                
        String clazz = data[0].toLowerCase();// cannot use word "class" as a variable

        // parsing the data and check validness of data
        try {
            if (clazz.startsWith("scenario") && data.length == 1) {
                // adding scenario after one set of data
                // i.e second round adding the first round data
                if (passengers.size() != 0 && pedestrians.size() != 0) {
                    //create a new object here will lead to wrong referencing
                    //Scenario scenario = new Scenario();
                    scenario.setPassengers(passengers);
                    scenario.setPedestrians(pedestrians);
                    scenarios.add(scenario);
                }
                // create new arraylist for based on the same arrayList
                // for different referencing, or it will be always
                // the same data in total
                passengers = new ArrayList<Character>();
                pedestrians = new ArrayList<Character>();

                if (clazz.equals("scenario:green")) { // could be wrong here
                    lineCount++ ;
                    //correct way to create new object in a loop
                    scenario = new Scenario(); 
                    scenario.setLegalCrossing(true);
                }

                else if (clazz.equals("scenario:red")){ // could be wrong as well
                    lineCount++ ;
                    //correct way to create new object in a loop
                    scenario = new Scenario();
                    scenario.setLegalCrossing(false);                          
                }     
                continue;
            }

            if (data.length == NO_OF_FIELDS) { 
            // adding person and animal
            // to passengers and pedestrians
                ...
            } else {
                lineCount++;
                throw new InvalidDataFormatException();                    
            }
        } catch (InvalidDataFormatException e) {           
            System.out.println("WARNING: invalid data format in config file in line " + lineCount);                   
        }             
    }
    //add the last round data
    scenario.setPassengers(passengers);
    scenario.setPedestrians(pedestrians);
    scenarios.add(scenario);

    scenario.setPassengers(passengers);
    scenario.setPedestrians(pedestrians);
 }
...