解析天气数据并在集合中对其进行排序
Parsing weather data and sort it in collection
遇到以下问题:我正在解析 xml 天气数据,其中包含关于 3 个不同
的信息
weather stations:
<station>
<station_id>TAPA</station_id>
<latitude>17.117</latitude>
<longitude>-61.783</longitude>
<xml_url>http://weather.gov/xml/current_obs/TAPA.xml</xml_url>
</station>
<station>
<station_id>TKPN</station_id>
<latitude>17.2</latitude>
<longitude>-62.583</longitude>
<xml_url>http://weather.gov/xml/current_obs/TKPN.xml</xml_url>
</station>
<station>
<station_name>Blackburne/Plymouth</station_name>
<latitude>16.75</latitude>
<longitude>-62.167</longitude>
<xml_url>http://weather.gov/xml/current_obs/TRPM.xml</xml_url>
</station>
接下来,我获取他们与我的设备的距离并获取以下数据集:
Distance(Double): Corresponding XML(String)
3495.3 http://weather.gov/xml/current_obs/TAPA.xml
1234.4 http://weather.gov/xml/current_obs/TKPN.xml
5678.7 http://weather.gov/xml/current_obs/TRPM.xml
将它们按升序排列在某种排序集合中并获得最短距离以获得相应 xml 文件的最佳方法是什么?我的意思是,距离将是关键,相应的 XML 将是它的价值。排序后,我将获得最小距离(这是第一个键)并访问我的 url 以对其执行其他一些工作。距离可能会改变,因为附近可能有其他车站,所以我需要以某种方式访问第一个键值对。你能给我一个提示吗?
好的。它是这样工作的:
为了能够通过 java 中的 property
sort
对象,您必须实现 Comparable
接口。然后,您需要覆盖名为 compareTo()
的方法,该方法使用当前实例 (this
) 和另一个实例以按正确的顺序对它们进行排序。所以,为了能够按站点之间的距离排序,你需要做这样的事情:
class Data implements Comparable<Data>{
String url;
double distance;
@Override
public int compareTo(Data other){
// compareTo should return < 0 if this is supposed to be
// less than other, > 0 if this is supposed to be greater than
// other and 0 if they are supposed to be equal
int result = this.distance <= other.distance ? -1 : 1;
return result;
}
}
完成此操作后,您将能够调用:
Collections.sort(dataList);
而且,您将按距离 属性 对对象进行排序。
好吧,我想补充一些内容,因为@Luis Lavierim 已经涵盖了必要的内容。
鉴于 xml 需要根元素,因为它现在无效,因为有多个根元素
我已经编写了假设根元素的测试代码<root></root>
您可以使用 simple framework 库来解析数据,这很容易。
Serializer serializer_Read = new Persister();
File source = new File(path);
Response response = serializer_Read.read(Response.class, source);
Collections.sort(response.getStations());
System.out.println("" + response.getStations().size());
for (Station station : response.getStations()) {
System.out.println("" + station.getStation_id());
}
好吧,您将需要某种类型对其进行排序,您检查此模型 class 以获取响应。该代码也可以在 Github 上找到并且已经过测试
@Root(name = "root", strict = false)
class Response {
@ElementList(name = "station", inline = true)
List<Station> stations;
public List<Station> getStations() {
return stations;
}
}
@Root(name = "station", strict = false)
class Station implements Comparable<Station> {
@Element(name = "station_id", required = false)
private String station_id;
@Element(name = "latitude", required = false)
private String latitude;
@Element(name = "longitude", required = false)
private String longitude;
@Element(name = "xml_url", required = false)
private String xml_url;
@Element(name = "distance", required = true)
private int distance;
public Station() {
}
public Station(String station_id, String latitude, String longitude, String xml_url) {
this.station_id = station_id;
this.latitude = latitude;
this.longitude = longitude;
this.xml_url = xml_url;
}
public String getStation_id() {
return station_id;
}
public String getLatitude() {
return latitude;
}
public String getLongitude() {
return longitude;
}
public String getXml_url() {
return xml_url;
}
public void setDistance(int distance) {
this.distance = distance;
}
public int getDistance() {
return distance;
}
@Override
public int compareTo(Station o) {
Station station = (Station) o;
return this.distance - station.getDistance();
}
}
遇到以下问题:我正在解析 xml 天气数据,其中包含关于 3 个不同
的信息weather stations:
<station>
<station_id>TAPA</station_id>
<latitude>17.117</latitude>
<longitude>-61.783</longitude>
<xml_url>http://weather.gov/xml/current_obs/TAPA.xml</xml_url>
</station>
<station>
<station_id>TKPN</station_id>
<latitude>17.2</latitude>
<longitude>-62.583</longitude>
<xml_url>http://weather.gov/xml/current_obs/TKPN.xml</xml_url>
</station>
<station>
<station_name>Blackburne/Plymouth</station_name>
<latitude>16.75</latitude>
<longitude>-62.167</longitude>
<xml_url>http://weather.gov/xml/current_obs/TRPM.xml</xml_url>
</station>
接下来,我获取他们与我的设备的距离并获取以下数据集:
Distance(Double): Corresponding XML(String)
3495.3 http://weather.gov/xml/current_obs/TAPA.xml
1234.4 http://weather.gov/xml/current_obs/TKPN.xml
5678.7 http://weather.gov/xml/current_obs/TRPM.xml
将它们按升序排列在某种排序集合中并获得最短距离以获得相应 xml 文件的最佳方法是什么?我的意思是,距离将是关键,相应的 XML 将是它的价值。排序后,我将获得最小距离(这是第一个键)并访问我的 url 以对其执行其他一些工作。距离可能会改变,因为附近可能有其他车站,所以我需要以某种方式访问第一个键值对。你能给我一个提示吗?
好的。它是这样工作的:
为了能够通过 java 中的 property
sort
对象,您必须实现 Comparable
接口。然后,您需要覆盖名为 compareTo()
的方法,该方法使用当前实例 (this
) 和另一个实例以按正确的顺序对它们进行排序。所以,为了能够按站点之间的距离排序,你需要做这样的事情:
class Data implements Comparable<Data>{
String url;
double distance;
@Override
public int compareTo(Data other){
// compareTo should return < 0 if this is supposed to be
// less than other, > 0 if this is supposed to be greater than
// other and 0 if they are supposed to be equal
int result = this.distance <= other.distance ? -1 : 1;
return result;
}
}
完成此操作后,您将能够调用:
Collections.sort(dataList);
而且,您将按距离 属性 对对象进行排序。
好吧,我想补充一些内容,因为@Luis Lavierim 已经涵盖了必要的内容。
鉴于 xml 需要根元素,因为它现在无效,因为有多个根元素
我已经编写了假设根元素的测试代码<root></root>
您可以使用 simple framework 库来解析数据,这很容易。
Serializer serializer_Read = new Persister();
File source = new File(path);
Response response = serializer_Read.read(Response.class, source);
Collections.sort(response.getStations());
System.out.println("" + response.getStations().size());
for (Station station : response.getStations()) {
System.out.println("" + station.getStation_id());
}
好吧,您将需要某种类型对其进行排序,您检查此模型 class 以获取响应。该代码也可以在 Github 上找到并且已经过测试
@Root(name = "root", strict = false)
class Response {
@ElementList(name = "station", inline = true)
List<Station> stations;
public List<Station> getStations() {
return stations;
}
}
@Root(name = "station", strict = false)
class Station implements Comparable<Station> {
@Element(name = "station_id", required = false)
private String station_id;
@Element(name = "latitude", required = false)
private String latitude;
@Element(name = "longitude", required = false)
private String longitude;
@Element(name = "xml_url", required = false)
private String xml_url;
@Element(name = "distance", required = true)
private int distance;
public Station() {
}
public Station(String station_id, String latitude, String longitude, String xml_url) {
this.station_id = station_id;
this.latitude = latitude;
this.longitude = longitude;
this.xml_url = xml_url;
}
public String getStation_id() {
return station_id;
}
public String getLatitude() {
return latitude;
}
public String getLongitude() {
return longitude;
}
public String getXml_url() {
return xml_url;
}
public void setDistance(int distance) {
this.distance = distance;
}
public int getDistance() {
return distance;
}
@Override
public int compareTo(Station o) {
Station station = (Station) o;
return this.distance - station.getDistance();
}
}