2015-07-21 43 views
-1

我有一個字符串,我需要分割並添加到不同的數組。使用處理分析大字符串

這是我的字符串

{ 「位置」:[{ 「緯度」: 「1.3846519」, 「東經」: 「103.763276」, 「開始時間」: 「1422720220292」, 「持續時間」:」 0" , 「準確性」: 「50.981998443604」},{ 「緯度」: 「1.3845814」, 「經度」: 「103.7634384」, 「開始時間」: 「1422720520181」, 「持續時間」: 「0」, 「準確性」:」 55.532001495361 「},{」 緯度 「:」 1.3844195" , 「經度」: 「103.763209」, 「開始時間」: 「1422720820265」, 「持續時間」: 「0」, 「準確性」: 「34.5」},{ 「緯度」 :「1.3844051」,「經度」:「103.7632272」,「startTime」:「1422721120466」,「duration」:「0」,「accuracy」:「36」}, ],「success」:1}

我想要的輸出就像這樣在不同的數組中。

latitudeArray[] = // String array of latitude values 
longitudeArray[] = // String array of longitude values 
startTimeArray[] = // String array of start time values 
durationArray[] = // String array of duration values 
accuracyArray[] = // String array of accuracy values 

我正在使用處理IDE分析我的數據,我嘗試了matchAll()和split()函數,但無法使其工作。 你能幫我得到我的輸出嗎?謝謝。

編輯:我設法提取一個緯度值,但我的方法似乎效率很低。我怎樣才能在循環內做到這一點?

String[] locationData = loadStrings("sample.txt"); 
    ArrayList<String> latitudeArray = new ArrayList<String>(); 
    ArrayList<String> longitudeArray = new ArrayList<String>(); 
    ArrayList<String> startTimeArray = new ArrayList<String>(); 
    ArrayList<String> durationArray = new ArrayList<String>(); 
    ArrayList<String> accuracyArray = new ArrayList<String>(); 
    String temp; 
    int index; 

    index = locationData[0].indexOf("latitude"); 
    println(index); 
    temp = locationData[0].substring(index+11); 
    println(temp); 
    index = temp.indexOf(","); 
    println(index); 
    latitudeArray.add(temp.substring(0,(index-1))); 
    println(latitudeArray.get(0)); 
+0

發佈您嘗試過的一段代碼。 '「但是無法工作」 - 爲什麼不呢?你面臨的問題是什麼? – Vineet

+1

使用JSON解析器而不是字符串操作。 – Codebender

+0

@Vineet請參閱編輯,謝謝 – Hasala

回答

0

不知道以什麼格式的loadStrings()方法返回,所以我只是用你提供的初始String

你正朝着正確的方向使用字符串方法。此代碼嘗試從單個input字符串中受益。如果按「緯度」分組,則除了第一個元素之外,數組中的所有元素都將包含我們在開始時感興趣的數字。例如爲:split("latitude\":\"")給出了開始時的所有緯度:

[0] = {"locations":[{" 
[1] = 1.3846519","longitude":"103.763276","startTime":"1422720220292","duration":"0","accuracy":"50.981998443604"},{" 
[2] = 1.3845814","longitude":"103.7634384","startTime":"1422720520181","duration":"0","accuracy":"55.532001495361"},{" 
[3] = 1.3844195","longitude":"103.763209","startTime":"1422720820265","duration":"0","accuracy":"34.5"},{" 
[4] = 1.3844051","longitude":"103.7632272","startTime":"1422721120466","duration":"0","accuracy":"36"}, ],"success":1} 

讀取實際的數字,我們只需要讀取直到下一個引號(")。做indexOf("\"")將使用我們必須閱讀的位置來檢索該數字。所以,只需執行substring(0,indexOfQuote)即可獲得價值。再次重複,但這次分裂「經度」來獲得它們。

全部程序:

public static void main(String[] args) { 
    final String INPUT = "{\"locations\":[" 
      + "{\"latitude\":\"1.3846519\",\"longitude\":\"103.763276\",\"startTime\":\"1422720220292\",\"duration\":\"0\",\"accuracy\":\"50.981998443604\"}," 
      + "{\"latitude\":\"1.3845814\",\"longitude\":\"103.7634384\",\"startTime\":\"1422720520181\",\"duration\":\"0\",\"accuracy\":\"55.532001495361\"}," 
      + "{\"latitude\":\"1.3844195\",\"longitude\":\"103.763209\",\"startTime\":\"1422720820265\",\"duration\":\"0\",\"accuracy\":\"34.5\"}," 
      + "{\"latitude\":\"1.3844051\",\"longitude\":\"103.7632272\",\"startTime\":\"1422721120466\",\"duration\":\"0\",\"accuracy\":\"36\"}," 
      + " ],\"success\":1}"; 
    String latitudeArray[] = splitAndCollect("latitude", INPUT); 
    String longitudeArray[] = splitAndCollect("longitude", INPUT); 
    String startTimeArray[] = splitAndCollect("startTime", INPUT); 
    String durationArray[] = splitAndCollect("duration", INPUT); 
    String accuracyArray[] = splitAndCollect("accuracy", INPUT); 
    System.out.println("Done"); 
} 

private static String[] splitAndCollect(String string, String input) { 
    final String COLON = "\":\""; 
    String[] split = input.split(string + COLON); 
    String[] output = new String[split.length - 1]; 
    for (int i = 0; i < output.length; i++) 
     // Using [i+1] - since split[0] contains "locations". 
     // Subsequent splits will have the numbers needed. 
     output[i] = split[i + 1].substring(0, split[i + 1].indexOf("\"")); 
    System.out.println(string + "\n" + Arrays.toString(output)); 
    return output; 
} 
+0

我用JSON解析器來提取我想要的數據。謝謝 – Hasala

0

如果可以預處理文件,CSV。文件使用簡單的shell腳本,然後在java中做字符串處理,我想你可以獲得更好的性能。對於csv。 Java中的文件處理,請參考http://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/(本博客包含簡單示例)。

如果你在解析之前做了一些預處理步驟(即使在Java中),你可以簡單地用一個循環獲得這些字符串數組的所有值。你可以使用Vineet使用單循環的方法。因此,與預處理步驟的整體循環計數變爲2

感謝, 米利

+0

謝謝你,我用JSON來提取數據。 – Hasala

0

看來你有JSON格式的數據。您試圖從中獲取數據的方式相當困難(但可行)。您可以試試JSON解析器。它易於學習和使用。你可以找到一個例子here

+0

我能夠用JSON解析來完成它。謝謝。 – Hasala