帮朋友写了一道Java IO方面的题,趁机会来写一些东西,要不然以后又都忘记了
解题思路和步骤
1)、写两个对应的Javabean
2)、通过程序读到文件
3)、读到文件之后把每个部分都分隔开
4)、将分隔开的数据分别赋值给对象的不同属性
5)、每个对象的数据赋值完放入到集合中
6)、两个txt一样的步骤
7)、从站点集合和观测数据集合中取出对象,通过区站号相等,进行匹配
8)、对相应的数据进行如题的计算
8)、输出题目要求的数据
MetaSta—> 站点的Javabean对象
public class MeteSta {
private String staName;
private String staNo;
private Double longitude;
private Double latitude;
private Double altitude;
private Double avgT;
private Double avgH;
private Double monthR;
public MeteSta(String staNo,String staName,Double longitude,Double latitude,Double altitude){
this.staName=staName;
this.staNo=staNo;
this.longitude=longitude;
this.latitude=latitude;
this.altitude=altitude;
}
public void setAvgT(Double avgT) {
this.avgT = avgT;
}
public void setAvgH(Double avgH) {
this.avgH = avgH;
}
public void setMonthR(Double monthR) {
this.monthR = monthR;
}
public String getStaName() {
return staName;
}
public void setStaName(String staName) {
this.staName = staName;
}
public String getStaNo() {
return staNo;
}
public void setStaNo(String staNo) {
this.staNo = staNo;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getAltitude() {
return altitude;
}
public void setAltitude(Double altitude) {
this.altitude = altitude;
}
public Double getAvgT() {
return avgT;
}
public Double getAvgH() {
return avgH;
}
public Double getMonthR() {
return monthR;
}
}
MeteObsData—>观测数据对象
public class MeteObsData {
private String staNo;
private Integer year;
private Integer month;
private Integer day;
private double temperature;
private double precipitation;
private double relahumidity;
public MeteObsData(String staNo, Integer year, Integer month, Integer day, double temperature, double precipitation, double relahumidity) {
this.staNo = staNo;
this.year = year;
this.month = month;
this.day = day;
this.temperature = temperature;
this.precipitation = precipitation;
this.relahumidity = relahumidity;
}
public String getStaNo() {
return staNo;
}
public void setStaNo(String staNo) {
this.staNo = staNo;
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getMonth() {
return month;
}
public void setMonth(Integer month) {
this.month = month;
}
public Integer getDay() {
return day;
}
public void setDay(Integer day) {
this.day = day;
}
public double getTemperature() {
return temperature;
}
public void setTemperature(double temperature) {
this.temperature = temperature;
}
public double getPrecipitation() {
return precipitation;
}
public void setPrecipitation(double precipitation) {
this.precipitation = precipitation;
}
public double getRelahumidity() {
return relahumidity;
}
public void setRelahumidity(double relahumidity) {
this.relahumidity = relahumidity;
}
}
import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class ReadFile {
List<MeteSta> staList=new ArrayList<MeteSta>();
String staFileName="实验四成都站点信息文件.txt";
String metObsFileName="实验四气象观测数据.txt";
List<MeteObsData>obsList=new ArrayList<MeteObsData>();
public boolean readStaFile() throws IOException {
try {
String encoding = "UTF-8";
File file = new File("D:/Desktable/"+staFileName);//拿到文件
//判断拿到的是否是文件以及文件是否存在
if(file.isFile() && file.exists()) {
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = null;
//先读一下文件第一行的文字标注信息
line = bufferedReader.readLine();
while((line = bufferedReader.readLine()) != null) {
//通过split的方式分隔开
String[] MeteStas = line.split("\t");
MeteSta meteSta = new MeteSta(MeteStas[0], MeteStas[4], Double.parseDouble(MeteStas[1]), Double.parseDouble(MeteStas[2]), Double.parseDouble(MeteStas[3]));
staList.add(meteSta);
}
}
} catch (FileNotFoundException e) {
System.out.println("文件读取出错");
e.printStackTrace();
}
return true;
}
public boolean readObsData() throws IOException {
try {
String encoding = "UTF-8";
File file = new File("D:/Desktable/"+metObsFileName);
if(file.isFile() && file.exists()) {
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = null;
line = bufferedReader.readLine();
while((line = bufferedReader.readLine()) != null) {
String[] meteObsDatas = line.split("\t");
MeteObsData meteSta = new MeteObsData(meteObsDatas[0], Integer.parseInt(meteObsDatas[1]) , Integer.parseInt(meteObsDatas[2]), Integer.parseInt(meteObsDatas[3]), Double.parseDouble(meteObsDatas[4]), Double.parseDouble(meteObsDatas[5]), Double.parseDouble(meteObsDatas[6]));
obsList.add(meteSta);
}
}
} catch (FileNotFoundException e) {
System.out.println("文件读取出错");
e.printStackTrace();
}
return true;
}
public boolean generate(){
List<MeteSta> totalList=new ArrayList<MeteSta>();
for(MeteSta ms:staList){
String no=ms.getStaNo();
Double sumT=0.0;
Double sump=0.0;
Double sumh=0.0;
for(MeteObsData mod:obsList){
if(mod.getStaNo().equals(no)){
sumT+=mod.getTemperature();
sump+=mod.getPrecipitation();
sumh+=mod.getRelahumidity();
}
}
ms.setAvgT(sumT/31);//月平均气温
ms.setAvgH(sumh/31);//月平均相对湿度
ms.setMonthR(sump);//月累计降水量
}
DecimalFormat df = new DecimalFormat("###.##");
for(MeteSta ms:staList){
double avgT = ms.getAvgT();
double avgH = ms.getAvgH();
double monthR = ms.getMonthR();
avgT = Double.parseDouble(df.format(avgT));
avgH = Double.parseDouble(df.format(avgH));
monthR = Double.parseDouble(df.format(monthR));
System.out.println("区站号:"+ms.getStaNo()+" 站名:"+ms.getStaName()+
" 纬度:"+ms.getLatitude()+" 经度:"+ms.getLongitude()+" 海拔高度:"+ms.getAltitude()+
" 月平均相对湿度:"+avgH+
" 月平均气温:"+avgT+" 当月累计降水量:"+monthR);
}
return true;
}
}
1、怎么读文件的问题
通过查了很多博客,又把IO这块复习了一下
2、读到每一行的数据怎么分割
通过split这个方法,通过观察,文件使用的Tab键分隔开的
所以用split("\t")的方式
split的用法:
分割\
split("\\")
分割|
split("\\|")
分割*
split("\\*")
分割:
split("\\:")
分割.
split("\\.")
分割^
split("\\^")
分割@
split("@")
分割,
split(",")
分割多个字符
split("\\^|@|#") ---> 把这些字符都写出来就行了
分割Tab键
split("\t")
分割空格
split(" ")
3、读取中文乱码
这种情况基本就是编码格式的问题。通过看txt文档的编码
格式,在读取的时候确定相应的编码格式
4、文件地址
Java中常用/来分割路径,比如:D:/Desktable/
5、split方法分割出的每部分都是String类型,需要根据需求
进行数据类型转换
/*
将String类型转换为int类型,因为parseInt是静态成员,所以直
接类名.成员名调用
*/
Integer.parseInt()
/*
将String类型转换为double类型,因为parseDouble是静态成员,
所以直接类名.成员名调用
*/
Double.parseDouble()
6、如何将站点数据与只有区站号的数据进行关联,并进行
数据计算操作呢?
public boolean generate(){
List<MeteSta> totalList=new ArrayList<MeteSta>();
for(MeteSta ms:staList){
String no=ms.getStaNo();
Double sumT=0.0;
Double sump=0.0;
Double sumh=0.0;
for(MeteObsData mod:obsList){
if(mod.getStaNo().equals(no)){
sumT+=mod.getTemperature();
sump+=mod.getPrecipitation();
sumh+=mod.getRelahumidity();
}
}
ms.setAvgT(sumT/31);//月平均气温
ms.setAvgH(sumh/31);//月平均相对湿度
ms.setMonthR(sump);//月累计降水量
}
7、对输出数据进行格式化
DecimalFormat df = new DecimalFormat("###.##");
double avgT = ms.getAvgT();
double avgH = ms.getAvgH();
double monthR = ms.getMonthR();
avgT = Double.parseDouble(df.format(avgT));
avgH = Double.parseDouble(df.format(avgH));
monthR = Double.parseDouble(df.format(monthR));
DecimalFormat文档:
https://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/text/DecimalFormat.html
DecimalFormat是进行格式化操作的类。
# 阿拉伯数字,如果不存在则显示为 0
. 小数分隔符或货币小数分隔符
"###.##"表示取两位小数
但是decimal的format方法处理结果的返回值是String类型,还需要根据需求进行数据类型转换,同时用属性接受转换后的结果