我有一个很长的字符串包含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
如果你不知道所有你想要用作'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);
}
}