【问题标题】:Is there a way to pick out specific elements from an ArrayList?有没有办法从 ArrayList 中挑选出特定的元素?
【发布时间】: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 循环,对吗?

标签: java arraylist io


【解决方案1】:

查找温度时,不应查找 ArrayList 的最后 3 个元素,而是查找 ArrayList 中每个元素内部的数据

从第一个条目中获取温度:

TempRead entry = t.get(0);
double maxTemp = entry.getMaxTemp();
double minTemp = entry.getMinTemp();
double avgTemp = entry.avgTemp();
//do stuff

如果您需要每个条目,请使用循环:

for(TempRead entry : t)
{
    double maxTemp = entry.getMaxTemp();
    double minTemp = entry.getMinTemp();
    double avgTemp = entry.avgTemp();
    //do stuff
}

执行诸如平均所有 minTemp 值之类的任务

double totalMinTemp = 0.0;
int count = 0;
for(TempRead entry : t)
    if(entry.getMinTemp() != -9999)
    {
        avgMinTemp += entry.getMinTemp();
        count++;
    }
double avgMinTemp = totalMinTemp / count;

或者使用流(感谢@JeroenSteenbeeke)

double avgMinTemp = t.stream().filter(t -> t.getMinTemp() != -9999).collect(Collectors.averaging(TempRead::getMaxTemp‌​));

【讨论】:

  • 如果您使用的是 Java 8,您还可以将 Streams 与您的列表一起使用。计算最高温度的平均值? double averageMaxTemp = t.stream().collect(Collectors.averaging(TempRead::getMaxTemp));
  • @JeroenSteenbeeke 谢谢!随着 phflack 的回应,我得到了预期的结果。但它现在似乎在无限循环中打印。我不确定是什么原因造成的。我编辑了我的帖子以反映我在主代码中所做的更改
【解决方案2】:

你可以在arraylist上使用迭代器:

Iterator itr=t.iterator(); 
  while(itr.hasNext()){  //For each list element
    TempRead tr=(TempRead)itr.next(); //To access values of each list element as tr.maxTemp etc  
  }  

【讨论】:

  • tr.maxTemp 是私有的
  • 迭代器代替索引效率较低; ArrayList 是一个索引集合
猜你喜欢
  • 2021-06-01
  • 2013-11-26
  • 2022-01-05
  • 2020-03-14
  • 2011-10-19
  • 2021-05-25
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多