【发布时间】:2017-11-27 15:50:29
【问题描述】:
我正在尝试从三个单独的文件中读取输入,并且用户指定要读取的文件。每个文件中的每一行都包含有关温度读数的信息:纬度、经度、年、月、最高温度、最低温度和平均温度。所以每一行看起来像这样:
39.95 41.1667 2002 04 -9999 -9999 420
每个温度也将除以 10 以获取以摄氏度为单位的实际温度。如果温度为-9999,则不会读取。此外,每个项目都添加到我拥有的 ArrayList 中:
ArrayList<TempRead> t = new ArrayList();
我还有一个 TempRead 类,如下所示:
public class TempRead {
private double latitude = -100;
private double longitude = -180;
private int year = 0;
private int month = 0;
private double maxTemp = -9999;
private double minTemp = -9999;
private double avgTemp = -9999;
public TempRead(){}
public TempRead(double latitude, double longitude, int year, int month, double maxTemp, double minTemp, double avgTemp){
this.latitude = latitude;
this.longitude = longitude;
this.month = month;
this.year = year;
this.maxTemp = maxTemp;
this.minTemp = minTemp;
this.avgTemp = avgTemp;
}
public double getLatitude(){
return latitude;
}
public double getLongitude(){
return longitude;
}
public int getMonth(){
return month;
}
public int getYear(){
return year;
}
public double getMaxTemp(){
return maxTemp;
}
public double getMinTemp(){
return minTemp;
}
public double avgTemp(){
return avgTemp;
}
@Override
public String toString(){
return latitude + " " + longitude + " " + year + " " + month + " " + maxTemp + " " + minTemp + " " + avgTemp + " ";
}
我现在遇到的问题是我不确定如何获取 ArrayList 的温度元素。我做过这样的事情:
System.out.println(t.get(0));
它显示每一行实际上都被添加到 ArrayList 中,因为它打印出文件中的第一行。但我必须计算平均值,最大值和最小值。有没有办法可以专门挑选出 ArrayList 的最后三个值,以便进行这些计算?
编辑:这是我的主要内容:
public static void main(String[] args) {
ArrayList<TempRead> t = new ArrayList();
readFile(t);
avgAllTemps(t);
}
public static void readFile(ArrayList<TempRead>t){
try{
String userFileName;
Scanner in = new Scanner(System.in);
System.out.println("Enter name of file: ");
userFileName = in.next();
System.out.println();
Scanner file = new Scanner(new File(userFileName));
while(file.hasNext()){
t.add(new TempRead(file.nextDouble(), file.nextDouble(), file.nextInt(), file.nextInt(), file.nextDouble(), file.nextDouble(), file.nextDouble()));
}
}catch(IOException e){
System.out.println(e);
}
}
public static void avgTemps(ArrayList<TempRead>t){
double totalMinTemp = 0.0;
int count = 0;
for (TempRead entry : t) {
if (entry.getMinTemp() != -9999) {
totalMinTemp += entry.getMinTemp();
count++;
}
double avgMinTemp = totalMinTemp / count;
System.out.println("Avg of min temps in arraylist: " + avgMinTemp);
}
}
【问题讨论】:
-
真正的问题是什么?如何获取值或如何进行计算? t.get(0) = TempRead,所以 t.get(0).getMinTemp() = minTemp 值
-
嗯,是的,使用
t.size()找出有多少,然后使用t.get(size - 3)、t.get(size - 2)、t.get(size - 1)- 确保处理少于3 个元素的情况.虽然我看不出只读最后三个读数对你有什么帮助...... -
澄清一下:您
ArrayList包含TempRead类型的对象,它本身可能包含其他属性。所以“ArrayList 的最后三个值”在你使用它的方式上没有意义。t.get(0)将返回一个TempRead对象,您可以简单地调用该对象的方法来访问其属性:例如t.get(0).getMinTemp()。 -
使用
line.split(" ")获取字段数组。当心额外的空格和空行。你也可以看看opencsv.sourceforge.net - 创建一个文件阅读器,它将每一行分成几部分,每个部分在你的情况下都有特定的含义。您只需要使用 SPACE 作为分隔符。 -
@Stefan 我不是在问如何进行计算,我绝对可以自己做。我只是想知道是否有办法挑选出特定的信息,比如来自特定行的特定最高温度。所以是的,做 t.get(0).getMinTemp() 会得到我第一行的最低温度。但是如果文件有,比如说 50 行呢?我需要为此编写一个 for 循环,对吗?