2016-02-21 1 views
0

застрявших в следующем: я разбор данных 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 для выполнения какой-либо другой работы над ним. Расстояние может измениться, потому что поблизости могут быть другие станции, поэтому мне нужно получить доступ к самой первой паре Key-Value. Не могли бы вы дать мне подсказку.

+2

Создайте объект, представляющий данные Реализовать 'Comparable', а затем переопределить метод –

ответ

1

Хорошо. Вот как это работает:

Чтобы иметь возможность sort объектов по property в java, вам необходимо реализовать интерфейс 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); 

И , у вас будут отсортированы ваши объекты по расстоянию.

+1

Это было очень полезно, спасибо! – androider

+0

Нет проблем. Рад, что это помогло. –

1

Хорошо, я хотел бы добавить несколько вещей, поскольку @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()); 
      } 

ну, вам понадобится некоторый тип, чтобы сделать вид против него, вы проверяете этот класс модели для ответа. код также доступен на 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(); 
    } 
} 
+0

Спасибо! Это немного сложно для моего уровня знаний, но я обязательно изучу его. – androider

+1

@androider, все в порядке, используйте библиотечную документацию, это очень просто, я написал несколько примеров, касающихся библиотеки, вы хотели бы проверить https://github.com/pankajnimgade/JavaCoding_tutorials/tree/master/SimpleXMLFrameworkSample/src/example/простой/XML/рамки –

Смежные вопросы