【问题标题】:Searching in an Array that is parsed from a XML in Android在从 Android 中的 XML 解析的数组中搜索
【发布时间】:2010-12-02 10:27:38
【问题描述】:

我有这个 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 中搜索属于地码的数字。

我该怎么做?

【问题讨论】:

    标签: java android xml arrays parsing


    【解决方案1】:

    现在你有一个 Alarmdiensten 对象的 ArrayList。我建议您可能希望将其更改为地图,以便您存储土地代码与 Alarmdiensten 对象的地图。

    这样,您可以使用土地代码将 Alarmdiensten 从地图中取出,然后简单地在 Alarmdiensten 对象上调用 getPolitie() 等方法。

    顺便说一句,我会确保您封装了您的 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 的另一个要点是,您可能希望从 XML 解析中分离出构建 Alarmdiensten 对象的方法部分。 “每个方法都应该做好一件事,做好一件事。”

    【讨论】:

      【解决方案2】:

      使用 for 循环并搜索它

      for(Alarmdiensten land :diensten){
              if(land.landcode.equals(landcode) ){
                 // yes i got it, The current land. 
                  break;
              }
          }
      

      【讨论】:

        【解决方案3】:

        只需遍历列表:

        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");
        

        【讨论】:

        • Tnx 我使用了提供的示例 Map-example Martijd 并且它有效:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 2012-12-19
        • 1970-01-01
        • 2020-04-05
        相关资源
        最近更新 更多