2014-10-19 119 views
1

我正在使用for循環來解析android中的GPX文件,並將得到的lat和long放入適合google靜態映射的字符串中。靜態地圖api允許URL最多約2000個字符。限制for循環結果的大小

我想要做的就是遍歷gpx文件中的條目,以便獲得最大數量的細節而不會產生太多字符。例如,如果lat和long是10個字符,那麼我總是希望生成儘可能接近200個標記。

我開始這個工作代碼

List<Location> gpxList = decodeGPX(gpxFile); 
for(int i = 0; i < gpxList.size(); i++){ 
    info += ((Location)gpxList.get(i)).getLatitude() 
      + "," 
      + ((Location)gpxList.get(i)).getLongitude() + "|"; 
} 

最明顯的方式做到這一點是採取列表,併除以允許的(200在這個例子中)標記的最大數量的長度,確保這是一個整數,然後在循環迭代時增加這些項目。但是,我如何確保在列表末尾沒有出現界限錯誤?

編輯

要清楚,我想,以減少數據點的頻率,而不是減少點的數量如果是有道理的。想象一下,我有一個帶有2000個標記的gpx文件,可以進行往返。我想生成一個200點的列表,它仍然給出了完整的行程(精確度損失),而不是僅列出僅僅給出行程開始的前200個點

回答

1

在向info添加新字符之前String (我假設它是一個字符串),檢查要添加的字符數量,並驗證info字符串中是否有足夠的空間。如果不是,則結束循環。

List<Location> gpxList = decodeGPX(gpxFile); 
boolean hasRoom = true; 
for(int i = 0; i < gpxList.size() && hasRoom; i++) { 
    String next = ((Location)gpxList.get(i)).getLatitude() 
      + "," 
      + ((Location)gpxList.get(i)).getLongitude() + "|"; 
    if (info.length()+next.length()<=2000) 
     info += next; 
    else 
     hasRoom = false; 
} 
+4

考慮使用一個StringBuilder(在循環之前創建),而不是在循環內創建String並執行String contatenation。使用Strings的解決方案創建了很多對象 - 這對垃圾收集器來說是很多工作。 – 2014-10-19 19:33:18

+2

@BartoszBilicki我完全同意。我只是根據OP的代碼來回答我的答案。我通常用字符串上的'+'運算符來改變代碼來代替使用StringBuilder。 – Eran 2014-10-19 19:39:38

+0

謝謝,但不是我在找什麼。我的錯,我會添加一個編輯,試圖清除這個問題 – EnduroDave 2014-10-19 19:44:23