基于BufferedReader中的一行从String数组创建对象?

时间:2016-03-11 23:32:58

标签: java arrays

我一直在试图解决这个问题,这让我很难过。

我有一个类,它包含来自另一个类的对象的数组列表。 我正在尝试使用缓冲读取器从文本文件中获取对象的数据。 文本文件包含每行上新对象的信息。 我无法将数据循环到对象中。每次我尝试所有对象都有来自文本文档最后一行的数据。

这是数组列表所在类的代码块。

package weatherapp;
import java.util.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class WeatherHistory extends WeatherObservation{
    BufferedWriter writer = null;
    BufferedReader reader = null;
    File myFile = new File("observations.txt");
    FileReader fileReader  = null;
    WeatherObservation readIn = new WeatherObservation();
    float tempReadIn;
    int humidReadIn;
    int UVReadIn;
    int windSpeedReadIn;
    int lineCounter = 0;

    WeatherHistory(){    
}

private ArrayList<WeatherObservation> list = new ArrayList<>();
int index;


//Add elements to the list
public void add(WeatherObservation item){
    list.add(item);
}

public void indexAdd(int index, WeatherObservation item){
    list.add(index, item);
}

//remove elements from the list
public void remove(WeatherObservation item){
    list.remove(item);
}

public  void indexRemove(int index){
    list.remove(index);
}

//update element
public void set(int index, WeatherObservation item){
    list.set(index, item);
}

//Return index of an object
public int indexOf(WeatherObservation item){
    return list.indexOf(item);
}

//return object at an idex
public WeatherObservation get(int index){
    return list.get(index);    
}

//Get size of array list
public int size(){
    return list.size();
}

//search list
public boolean search(WeatherObservation item){
    return list.contains(item);
}


//Print list
public void getList(){
    for(int counter = 0; counter < list.size(); counter++){
        System.out.println(list.get(counter));
    } 
}    


    public void add(){        

        try{ 
        fileReader = new FileReader(myFile);
        reader = new BufferedReader(fileReader);
        reader.readLine();
        //Skip over the first line to get to the data
        String line = null;

        while((line = reader.readLine()) !=null){
        lineCounter ++;            
        String[ ] data = line.split(" ");

        //get place and date from array
        readIn.place(data[0]);
        readIn.dateDay(data[1]);
        System.out.println(line);         

        //convert String from array to needed format       
         try
    {
        tempReadIn = Float.valueOf(data[2]);
        humidReadIn = Integer.parseInt(data[3]);
        UVReadIn = Integer.parseInt(data[4]);
        windSpeedReadIn = Integer.parseInt(data[5]);
    }
    catch (NumberFormatException nfe)
    {
      Logger.getLogger(WeatherHistory.class.getName()).log(Level.SEVERE,
                    null, nfe);
    }         
        readIn.temp(tempReadIn);
        readIn.humid(humidReadIn);
        readIn.uvIndex(UVReadIn);
        readIn.windSpeed(windSpeedReadIn);





        }    
        }   catch (IOException ex){
            Logger.getLogger(WeatherHistory.class.getName()).log(Level.SEVERE,
                    null, ex);        

        } finally {
            try{
            if(reader !=null){
            reader.close();
        }
        } catch (IOException ex){
            Logger.getLogger(WeatherHistory.class.getName()).log(Level.SEVERE,
                    null, ex);
    }



        }

        for(int j = 0;j < lineCounter; j++){ 
                list.add(readIn);

        }
    }
}

当我打印列表时,所有对象都具有相同的数据,并且添加了最后一个对象的数据。

package weatherapp;


public class WeatherApp {


    public static void main(String[] args) {

        WeatherHistory WHtest = new WeatherHistory(); 




WHtest.add();

WHtest.getList();



    }
}

如何正确地将对象添加到数组列表中?

结果我向列表的所有位置添加了一个对象。

2 个答案:

答案 0 :(得分:1)

  

所有对象都有相同的数据

'所有对象'是什么?您将相同的对象添加到数组中的每个位置。只有一个对象,所以当然它总是有相同的数据。

答案 1 :(得分:0)

我解决了这个问题。感谢EJB让我知道我正在重用同一个对象。

我搬了

WeatherObservation readIn = new WeatherObservation();

到while循环内部

我摆脱了for循环 -

    for(int j = 0;j < lineCounter; j++){ 
            list.add(readIn);

    }

并放置

list.add(readIn)

来自while循环中的for循环

我希望这有助于任何遇到类似问题的人。