Поиск в массиве, который анализируется с XML в Android - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть этот XML-файл, который я анализирую в ArrayList

В этом ArrayList у меня есть страны и номера тревоги для стран в нем.

Я хочу найти страну и получить ее полицию, скорую помощь или пожарную охрану. число.

Вот код, который поможет вам.

Разбор XML в ArrayList:

protected ArrayList<Alarmdiensten> getAlarmdiensten() {
     ArrayList<Alarmdiensten> lijst = new ArrayList<Alarmdiensten>();
     try {
      DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();
      Document doc = builder.parse(getAssets().open("alarmdiensten.xml"));
      NodeList nl = doc.getElementsByTagName("land");
      for (int i=0;i<nl.getLength();i++) {
       Node node = nl.item(i);
       Alarmdiensten land = new Alarmdiensten();

                land.land = Xml.innerHtml(Xml.getChildByTagName(node, "naam"));
       land.landcode = Xml.innerHtml(Xml.getChildByTagName(node, "code"));
       land.politie = Xml.innerHtml(Xml.getChildByTagName(node, "politie"));
       land.ambulance = Xml.innerHtml(Xml.getChildByTagName(node, "ambulance"));
       land.brandweer = Xml.innerHtml(Xml.getChildByTagName(node, "brandweer"));
       land.telamba = Xml.innerHtml(Xml.getChildByTagName(node, "telamba"));
       land.adresamba = Xml.innerHtml(Xml.getChildByTagName(node, "adresamba"));

       lijst.add(land);
      }
     } catch (Exception e) {;
     }
     return lijst;
    }

Метод, который будет использовать номера будильника:

    public void AlarmMenu(){
     String landcode;
        ArrayList<Alarmdiensten> diensten = getAlarmdiensten();
     if(fakelocation = true) {
      landcode = sfakelocation;
     }
     else {
      try {
    landcode = getAddressForLocation(this, locationNow).getCountryCode();
   } catch (IOException e) {
    e.printStackTrace();
   }
     }

Итак, у меня есть код земли, и я хочу найти в ArrayList diensten номера, которые принадлежат к номеру земли.

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 02 декабря 2010

Просто выполните итерации по списку:

String landcode = getLandCode();
for (Alarmdiensten dienst:diensten) {
  if (dienst.landcode.equals(landcode)) {
    // do what has to be done
  }
}

Попробуйте использовать карту вместо списка, если вам приходится искать значения чаще:

Map<String, List<Alarmdiensten>> servicesInCountry 
                   = new HashMap<String, List<Alarmdiensten>>();
for (Alarmdiensten dienst:diensten) {
  List<Alarmdiensten> list = servicesInCountry.get(dienst.landcode);
  if (list == null) {
     list = new ArrayList<Alarmdiensten>();
     servicesInCountry.put(dienst.landcode, list);
  }
  list.add(dienst);
}

// ... and later on
List<Alarmdiensten> servicesInSweden = servicesInCountry.get("SWE");
1 голос
/ 02 декабря 2010

Ну, на данный момент у вас есть ArrayList объектов Alarmdiensten. Я бы посоветовал вам изменить это на Карту так, чтобы вы хранили Карту земельных кодов против ваших объектов Alarmdiensten.

Таким образом, вы получаете Alarmdiensten с карты, используя код земли, а затем просто вызываете методы getPolitie () и т.д. для вашего объекта Alarmdiensten.

Я бы позаботился о том, чтобы вы инкапсулировали свой объект Alarmdiensten, кстати, прямой доступ к его закрытым членам - это что-то вроде нет-нет :)

Так что-то вроде:

protected Map<String, Alarmdiensten> getAlarmdiensten()
{
  Map<String, Alarmdiensten> alarmNumbersForCountries 
                                             = new HashMap<String, Alarmdiensten>();

  try
  {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(getAssets().open("alarmdiensten.xml"));
    NodeList nl = doc.getElementsByTagName("land");
    for (int i = 0; i < nl.getLength(); i++)
    {
      Node node = nl.item(i);
      Alarmdiensten land = new Alarmdiensten();

      land.setLand(Xml.innerHtml(Xml.getChildByTagName(node, "naam")));
      land.setLandcode(Xml.innerHtml(Xml.getChildByTagName(node, "code")));
      land.setPolitie(Xml.innerHtml(Xml.getChildByTagName(node, "politie")));
      land.setAmbulance(Xml.innerHtml(Xml.getChildByTagName(node, "ambulance")));
      land.setBrandweer(Xml.innerHtml(Xml.getChildByTagName(node, "brandweer")));
      land.setTelamba(Xml.innerHtml(Xml.getChildByTagName(node, "telamba")));
      land.setAdresamba(Xml.innerHtml(Xml.getChildByTagName(node, "adresamba")));

      alarmNumbersForCountries.put(land.getLandCode(), land);
    }
  } 
  catch (Exception e)
  {
    // Handle Exception
  } 
  return alarmNumbersForCountries;
}

Чтобы получить запись с карты

Alarmdiensten land = alarmNumbersForCountries.get(landcode);

Еще один момент YMMV заключается в том, что вы можете выделить часть вашего метода, который создает объекты Alarmdiensten из анализа XML. «Каждый метод должен хорошо выполнять одно и одно дело».

1 голос
/ 02 декабря 2010

Используйте цикл for и найдите его

for(Alarmdiensten land :diensten){
        if(land.landcode.equals(landcode) ){
           // yes i got it, The current land. 
            break;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...