【发布时间】:2019-12-24 11:35:37
【问题描述】:
我想将信息存储在 ArrayList 中。我正在从 csv 文件中获取数据,但有相同的数据,我想消除它们。最有效的方法是什么?我考虑了两种方法:将所有数据添加到 Set 并将其转换为 ArrayList。将它们添加到 ArrayList 中,同时检查它不包含相同的数据。这是我的代码:
public static void sanitization(String file_path) throws FileNotFoundException, IOException {
File file = new File(file_path);
BufferedReader reader = new BufferedReader(new FileReader(file)); //read the csv file
Set<Flight> flights_set = new HashSet<>(); //All valid flights will be added to set in order to prevent from adding same flights.
String[] split = new String[31];
String st;
while ((st = reader.readLine()) != null) {
split = st.split(",", -2);
flights_set.add(new Flight(split[4], split[5], Integer.valueOf(split[11]), split[7], split[8], Integer.valueOf(split[0]), Integer.valueOf(split[1]), Integer.valueOf(split[2])));
}
//Second possible way
/*while ((st = reader.readLine()) != null) {
split = st.split(",", -2);
Flight f=new Flight(split[4], split[5], Integer.valueOf(split[11]), split[7], split[8], Integer.valueOf(split[0]), Integer.valueOf(split[1]), Integer.valueOf(split[2]));
if(!flights_arraylist.contains(f))
flights_arraylist.add(f);
}*/
ArrayList<Flight> flights_arraylist = new ArrayList<>(flights_set);
}
class Flight implements Comparable<Flight> {
//All necessary information
public String airline;
public String flight_number;
public Integer departure_delay;
public String origin_airport_name;
public String destination_airport_name;
public Integer year;
public Integer month;
public Integer day;
//Constructor
public Flight(String airline, String flight_number, Integer departure_delay, String origin_airport_name, String destination_airport_name, Integer year, Integer month, Integer day) {
this.airline = airline;
this.flight_number = flight_number;
this.departure_delay = departure_delay;
this.origin_airport_name = origin_airport_name;
this.destination_airport_name = destination_airport_name;
this.year = year;
this.month = month;
this.day = day;
}
public Flight() {
}
//Flight is bigger if its departure delay is bigger
public int compareTo(Flight o) {
if (this.departure_delay > o.departure_delay) return 1;
else if (this.departure_delay < o.departure_delay) return -1;
else return 0;
}
@Override
public boolean equals(Object obj) {
Flight f = (Flight) obj;
if ((this.airline.equals(f.airline)) && (this.flight_number.equals(f.flight_number)) && (this.departure_delay.equals(f.departure_delay)) && (this.origin_airport_name.equals(f.origin_airport_name)) && (this.destination_airport_name.equals(f.destination_airport_name)) && (this.year.equals(f.year)) && (this.month.equals(f.month)) && (this.day.equals(f.day))) {
return true;
}
return false;
}
@Override
public int hashCode() {
return 0;
}
@Override
public String toString() {
return this.airline + " " + this.flight_number + " " + this.departure_delay;
}
}
这也是我的第一个问题,如果我犯了任何错误请警告我
【问题讨论】:
-
你可以使用 Set
,有没有必要使用 ArrayList ? -
让您的
Flight对象计算正确的哈希码是一种很好的形式。您的 Java IDE 可能能够为您生成合适的hashCode()方法,或者您可以使用Objects.hash来简化自己编写的任务。当HashSets 和HashMaps 中的所有对象都具有相同的哈希码时,它们可能可能遭受性能下降。 -
使用
Set而不是ArrayList是一种非常好的方法。唯一需要考虑的是集合成员是否需要插入顺序。 -
@MdFaraz 我稍后会对它们进行排序。
标签: java performance arraylist set