【问题标题】:Analyse large String using processing使用处理分析大字符串
【发布时间】:2015-07-21 02:23:26
【问题描述】:

我有一个字符串需要拆分并添加到不同的数组中。

这是我的字符串

{"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"}, ],"成功":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));

【问题讨论】:

  • 发布一些您尝试过的代码。 "but couldn't get it work" - 为什么不呢?你遇到了什么问题?
  • 使用 JSON 解析器而不是字符串操作。
  • @Vineet 请查看编辑,谢谢
  • @Codebender 我从来没有用过。你能详细说明一下吗?
  • @Hasala,谷歌JSON parsing in Java

标签: java arrays string arraylist


【解决方案1】:

不确定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;
}

【讨论】:

  • 我使用 JSON 解析器来提取我想要的数据。谢谢
【解决方案2】:

如果您可以将文件预处理为 csv.使用简单的shell脚本文件,然后在java中进行字符串处理,我认为你可以获得更好的性能。对于 .csv。 Java文件处理,参考http://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/(本博客包含简单示例)。

如果您在解析之前执行一些预处理步骤(即使在 Java 中),您只需一个循环即可将所有值获取到这些字符串数组中。您可以使用 Vineet 建议的方法使用单循环。因此,通过预处理步骤,总循环数变为 2。

谢谢, 米利

【讨论】:

  • 谢谢mili,我用JSON提取数据。
【解决方案3】:

您似乎有 JSON 格式的数据。您尝试从中获取数据的方式非常困难(但可行)。您可以尝试 JSON 解析器 。它易于学习和使用。你可以找到一个例子here

【讨论】:

  • 我可以通过 JSON 解析来做到这一点。谢谢。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2011-08-31
相关资源
最近更新 更多