这是我的第一篇文章,所以如果我没有说清楚,我会很乐意提供更多细节。 我正在使用Java编写路由API。该文件的大部分正确解析一个部分。我感兴趣的XML部分看起来像这样:
<way id="30184957" user="Central America" uid="69853" visible="true" version="2" changeset="4961491" timestamp="2010-06-11T10:52:19Z">
<nd ref="332597303"/>
<nd ref="332597551"/>
<nd ref="332597552"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Rae's Court"/>
</way>
</b>
我的代码的相关部分如下所示:
public void startElement(String uri, String localName, String qName, Attributes attributes)
{
if (qName == "node") //if the tag value is node
{
Node currentNode = new Node(0, 0, 0); //new node with all 0 values
currentNode.nodeID = Integer.parseInt(attributes.getValue(0)); //set the ID to the id of the node
currentNode.nodeLat = Double.parseDouble(attributes.getValue(1)); //set the Lat to the Lat of the node
currentNode.nodeLong = Double.parseDouble(attributes.getValue(2)); //set the Long to the Long of the node
allNodes.add(currentNode);
}
if (qName == "way") //if tag value is way
{
currentWay = new Way(0, null); //create a new way with 0 values
currentWay.wayID = Integer.parseInt(attributes.getValue(0)); //set the way id to the id of the way
//
}
if (qName == "nd") //if tag value is nd
{
Node searchNode = getNodeByID(Integer.parseInt(attributes.getValue(0))); //use getNodeByID method to check if
currentWay.containedNodes.add(searchNode);
}
}
我的问题:
我正在尝试创建一个包含ID的路径对象及其包含的节点列表(nd标记),nd标记只是对先前成功创建的节点对象的引用。目前我正在使用2个ArrayLists,一个用于节点,另一个用于方式。但是,getNodeByID()
方法必须在每次访问nd时搜索列表,并且对于较大的XML文件大幅减慢速度。
我似乎无法找到一种方法来读取nd的方式,而是必须在不同的if语句中搜索它们。
有什么方法可以找到方法,然后在同一个声明中,所有与它相关的nd?如果是这样,那么当我计划将这些数组列表更改为hashmaps时,它将使创建我的对象变得更加容易。
很抱歉,如果我不清楚......我不太擅长用文字描述这些问题。
答案 0 :(得分:0)
使用List
代替在Map<Integer,Node>
中存储要搜索的节点。这样搜索将是O(1)而不是O(n)。如果您需要按输入顺序排列它们,请将它们添加到List
以供日后使用,但请使用Map
进行搜索。
而不是
allNodes.add(currentNode);
你有
allNodes.put(currentNode.nodeId, currentNode);
答案 1 :(得分:0)
在endElement方法中插入(qname=="nd")
的代码,而不是在startElement方法中。