Java IO题

帮朋友写了一道Java IO方面的题,趁机会来写一些东西,要不然以后又都忘记了

题目:

Java IO题_第1张图片Java IO题_第2张图片
Java IO题_第3张图片
Java IO题_第4张图片

题目分析:

解题思路和步骤
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、如何将站点数据与只有区站号的数据进行关联,并进行
数据计算操作呢?

  1. 首先从staList(存放每个站点的数据的集合,每个站点是一个对象)中依次取出对象,获取它的区站号,并初始化温度、相对湿度、降水量为0。
  2. 嵌套二层循环,从obsList集合(存放观测数据)中依次取出每个数据,这个数据其实就是每个站点,在1月份每天的观测数据,主要是从中获取区站号,与站点数据的区站号进行匹配(相当于数据库中的外键功能),当区站号相同时,就对它的温度、相对湿度、降水量进行累计加合操作。这样就可以获取每个站点1月份温度、降水量、相对湿度数据的总合
  3. 对总和数据进行处理,得到题目中的平均温度、平均相对湿度、降水量总和
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类型,还需要根据需求进行数据类型转换,同时用属性接受转换后的结果

你可能感兴趣的:(Java)