解析天气数据并在集合中对其进行排序

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();
    }
}