如何只从数组列表中获得你想要的行,这取决于它们如何开始,在JAVA中



我有一个很长的字符串包含GPS数据,但这并不重要。我需要做的是将数组列表中的字符串(一个大字符串)分成多个部分。

棘手的部分是字符串由多个"gps句子"组成,而我只需要两种类型的这些句子。
我需要的类型从$GPSGSV和$GPSGGA开始。基本上,我只需要将这些句子转储到另一个数组列表,而将所有其余的留在后面。

新的数组列表必须是逐行形式,以便每个句子后面都有一个新的行。
每个句子的结尾都有一个空格,这在拆分时很有帮助。数组列表的数据如下所示。-从数组列表中打印出来的

[GPGSA美元,3,28岁,09年,26日,15日,08年,05年,21日,24日,07年…1.6,1.0,1.3 * 3,GPRMC美元,151018.000,,5225.9627,N, 00401.1624 W, 0.11,104.71, 210214 * 14日GPGGA美元,151019.000、5225.9627 N, 00401.1624 W, 1, 09年1.0,38.9米,51.1米,0000 * 72,GPGSA美元,3,28岁,09年,26日,15日,08年,05年,21日,24日,07年…1.6,1.0,1.3 * 3,GPGSV美元,3,1,12日,26日,80302年,44岁,09年55063年,40岁,05年,53191年,39岁,08年,51059年,37 * 79,GPGSV美元3 2,12日,28岁,43112年,34岁,15日,40284年,42岁,21岁,18305年,33岁,18057年,27 * 7 e,GPGSV美元,3,3,12日10 05153年,24岁,05234年,38岁,18岁,05318年,22岁,19岁,05035 * 79,GPRMC美元,151019.000,,5225.9627,N, 00401.1624 W, 0.10,105.97, 210214,, d * 1,GPGGA美元,151020.000、5225.9627 N, 00401.1624 W, 1, 09年1.0,38.9米,51.1米,0000 * 78,GPGSA美元,3,28岁,09年,26日,15日,08年,05年,21日,24日,07年…1.6,1.0,1.3 * 3,GPRMC美元,151020.000,,5225.9627,N, 00401.1624 W, 0.12,105.18, 210214年* 12,GPGSA美元,3,28岁,09年,26日,15日,08年,05年,21日,24日,07年…1.6,1.0,1.3 * 3,GPRMC美元,151021.000,,5225.9626,N, 00401.1624 W, 0.11, 99.26, 210214,, * 28日GPGGA美元,151022.000、5225.9626 N, 00401.1623 W, 1, 09年1.0,38.9米,51.1米,0000 * 7 c,GPGSA美元,3,28岁,09年,26日,15日,08年,05年,21日,24日,07年…1.6,1.0,1.3 * 3,GPRMC美元,151022.000,,5225.9626,N, 00401.1623 W, 0.11,109.69, 210214,, * 1 f,

数据持续到2000个句子。

任何帮助都太好了。由于

编辑,

回顾我所拥有的…如果我只读取以GSV或GGA标记开头的行(因为文件格式为每行一个句子)可能是最好的。在方法的缓冲读取器部分,我该怎么做呢?这是我的一些代码....

try {
    File gpsioFile = new File(gpsFile);
    FileReader file = new FileReader(gpsFile);
    BufferedReader buffer = new BufferedReader(file);
    StringBuffer stringbuff = new StringBuffer();
    String ans;

    while ((ans = buffer.readLine()) != null) {     
        gps.add(ans);
        stringbuff.append(ans);
        stringbuff.append("n");
    }
} catch (Exception e) {
    e.printStackTrace();
}

从这我可以得到一个数组列表只有GGA和GSV的句子/行,但在相同的顺序,他们是从文件?由于

好的,我首先使用spilt():

将字符串分割成单独的行。
  String[] split = "$GPGSA,A,3,28,09,26,15,08,05,21,24,07,,,,1.6,1.0,1.3*3A,".split(",");

也可以使用"n"代替","作为分隔符。这将为您提供一个可以迭代的数组。

  List<String> filtered = new ArrayList<String>()
  for (String item, split) {
       if (item.startsWith("$GPGSA")) {
            filtered.add(item);
       }
  }

filtered将是一个包含您想要保留的项的新Array。

此方法适用于JDK 6+。在JDK 8中,这种问题可以通过流API更优雅地解决。

我的理解是,你有一个数组列表与单个字符串元素。该字符串是一个逗号分隔的值列表。第一步是提取字符串并把它分成它的组成部分。一旦你这样做了,你可以依次处理每一个项目。

private static List<List<String>> splitData(final ArrayList<String> data) {
    final List<List<String>> filteredData = new ArrayList<List<String>>();
    String fullText = data.get(0);
    String[] splitData = fullText.split(",");
    List<String> currentList = null;
    for (int i = 0;i < splitData.length; i++) {
        final String next = splitData[i];
        if (startTags.contains(next)) {
            if (interestingStartTags.contains(next)) {
                currentList = new ArrayList<String>();
                filteredData.add(currentList);
            } else {
                currentList = null;
            }
        }
        if (currentList != null) {
            currentList.add(next);
        }
    }
    return filteredData;
}

两个静态Set提供所有"gps句子"开始标签的集合,以及你感兴趣的集合。分割数据方法使用starttag来确定它是否到达了新句子的开头。如果新标记也感兴趣,则创建一个新列表并将其添加到List>中。返回的就是这个列表的列表

如果你不知道所有你想要用作'startTag'的字符串,那么你可以使用next.startsWith("$GP")或类似的。

读取文件

看看如何读取文件的更新问题,您可以删除StringBuffer,而只是将您读取的每一行添加到ArrayList中。下面的代码将跳过不以您感兴趣的两个标记开头的任何行。lineList中的行顺序将与它们在文件中找到的顺序匹配。

FileReader file = new FileReader(gpsFile);
BufferedReader buffer = new BufferedReader(file);
String ans;
ArrayList<String> lineList = new ArrayList<String>();
while ((ans = buffer.readLine()) != null) {
    if (ans.startsWith("$GPSGSV")||ans.startsWith("$GPSGGA")) {
        lineList.add(ans);
    }
}

相关内容

  • 没有找到相关文章

最新更新