I have a function that reads air pollution data from a file and save it to an Array List. I’d like to filter the elements and print out the result.
I’m able to get a row from the ArrayList with System.out.println("1st element " + pollution.get(0))
but don’t know how to apply a filter to a single column.
The data file looks like this
shanghai 2015-321 15 15 93.8 16
beijing 2015-332 23 270 86 -1
The AirPollution class
public class AirPollution {
private String city;
private String date;
private int hour;
private double pm; // Particulate matter
private double humidity;
private double temperature;
/** Construct a new AirPollution object */
public AirPollution(String city, String date, int hour, double pm, double humidity, double temperature) {
this.city = city;
this.date = date;
this.hour = hour;
this.pm = pm;
this.humidity = humidity;
this.temperature = temperature;
}
/** Get the PM concentration */
public double getPM() {return this.pm;}
public String toString() {
return this.city + " at " + this.hour + " on " + this.date
+ " Humidity: " + this.humidity + " temperature: " + this.temperature;
}
}
Function that read the file and save it to an Array List
public class AirPollutionAnalyser {
private ArrayList<AirPollution> pollution = new ArrayList<AirPollution>();
public void loadData() {
try {
this.pollution.clear();
List<String> pollution = Files.readAllLines(Path.of(UIFileChooser.open("pollution.txt")));
for (String line : pollution) {
Scanner s = new Scanner(line);
String city = s.next();
String date = s.next();
int hour = s.nextInt();
double pm = s.nextDouble();
double humidity = s.nextDouble();
double temperature = s.nextDouble();
this.pollution.add(new AirPollution(city, date, hour, pm, humidity, temperature));
}
} catch(IOException e){UI.println("File reading failed");}
}
Print out all the records in the ArrayList that have a PM2.5 concentration 300 and over.
** This is the function I’d like to make changes to.**
public void findHazardousLevels() {
UI.clearText();
UI.println("PM2.5 Concentration 300 and above:");
UI.println("------------------------");
System.out.println("1st element " + pollution.get(0))
}
}
How to achieve the result with minimal changes to the current code ? Thanks
Advertisement
Answer
It isn’t clear from your class fields what PM2.5
is but you can print each entry that has a pm >= 300
like this. Since your class fields are private it presumes you have getters to obtain the fields.
public void findHazardousLevels() {
UI.clearText();
UI.println("PM2.5 Concentration 300 and above:");
UI.println("------------------------");
for(AirPollution p : pollution) {
if (p.getPm() >= 300) {
System.out.println(p);
}
}
}
Note: Your toString()
implementation does not have pm
included in the returned string.