在JAVA中,如何仅从arraylist中获取所需的行,具体取决于它们的开始方式

在JAVA中,如何仅从arraylist中获取所需的行,具体取决于它们的开始方式,java,string,arraylist,stringtokenizer,Java,String,Arraylist,Stringtokenizer,我有一个很长的字符串包含GPS数据,但这并不重要。我需要做的是将arraylist中的字符串(一个大字符串)分成多个部分 try { File gpsioFile = new File(gpsFile); FileReader file = new FileReader(gpsFile); BufferedReader buffer = new BufferedReader(file); StringBuffer stringbuff = new StringB

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

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();
}
棘手的是,字符串由多个“gps句子”组成,我只需要两种类型的句子
我需要的类型以$GPSGSV和$GPSGGA开头。基本上,我只需要将这些句子转储到另一个arraylist中,而将其余的都放在后面

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();
}
新的arraylist必须采用逐行的形式,以便每个句子后面都有新行。
每个句子的结尾都有一个空格,这在拆分时可能会有所帮助。arraylist数据如下所示。-这是从arraylist打印的

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();
}
[$GPGSA,A,3,28,09,26,15,08,05,21,24,07,,,,1.6,1.0,1.3*3A, $GPRMC,151018.000,A,5225.9627,N,00401.1624,W,0.11104.71210214,,*14, $GPGGA,151019.0005225.9627,北,00401.1624,西,1,09,1.0,38.9,米,51.1,米,0000*72, $GPGSA、A、3、28、09、26、15、08、05、21、24、07、、1.6、1.0、1.3*3A、, $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,07,18057,27*7E, $GPGSV,3,3,12,10,05153,24,05234,38,18,05318,22,19,05035,*79, $GPRMC,151019.000,A,5225.9627,N,00401.1624,W,0.10105.97210214,,*1D, $GPGGA,151020.0005225.9627,北,00401.1624,西,1,09,1.0,38.9,米,51.1,米,0000*78, $GPGSA、A、3、28、09、26、15、08、05、21、24、07、、1.6、1.0、1.3*3A、, $GPRMC,151020.000,A,5225.9627,N,00401.1624,W,0.12105.18210214,,*12, $GPGSA、A、3、28、09、26、15、08、05、21、24、07、、1.6、1.0、1.3*3A、, $GPRMC,151021.000,A,5225.9626,N,00401.1624,W,0.11,99.26210214,,*28, $GPGGA,151022.0005225.9626,北,00401.1623,西,1,09,1.0,38.9,米,51.1,米,0000*7C, $GPGSA、A、3、28、09、26、15、08、05、21、24、07、、1.6、1.0、1.3*3A、, $GPRMC,151022.000,A,5225.9626,N,00401.1623,W,0.11109.69210214,,*1F

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();
}
数据持续到2000句

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();
}
任何帮助都很好,谢谢

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();
}
编辑------

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();
}
回顾一下我所拥有的……如果我只阅读其中的几行可能是最好的(因为文件的格式是每行一句话)从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句子/行的Arraylist,但顺序与文件中的顺序相同吗?
谢谢

好的,我首先用spilt()将字符串拆分为单独的行:

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();
}
您还可以使用“\n”作为分割分隔符,而不是“,”。这将为您提供一个可以迭代的数组

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();
}
  List<String> filtered = new ArrayList<String>()
  for (String item, split) {
       if (item.startsWith("$GPGSA")) {
            filtered.add(item);
       }
  }
List filtered=new ArrayList()
对于(字符串项,拆分){
如果(项目启动时使用($GPGSA))){
过滤。添加(项目);
}
}
过滤后的将是一个新数组,其中包含要保留的项

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();
}

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

我的理解是,您有一个带有单个字符串元素的ArrayList。该字符串是一个逗号分隔的值列表。因此,第一步是提取字符串并将其拆分为组成部分。一旦您完成了此时,您可以依次处理每个项目

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();
}
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;
}

您尝试过什么?如果您花一些时间阅读字符串的javadoc,这很容易。这是一个Java ArrayList,并且您将“gps语句”定义为以$GPGSA(或类似)开头的一系列元素吗继续到下一个$GPGSA标记?查看字符串上的
split
startsWith
方法。您尝试过吗?该数组是字符串数组,我需要的所有数据(句子)都以$GPSGGA和$GPSGSV开头,但我不明白如何将数组的全部内容输入字符串[]=split=“…”将起作用。您的意思是字符串[]=split(arraylist名称)。split(“\n”);----同样对于筛选列表,“startsWith”操作符如何知道$GPSGSV之后的结束位置?例如..好的-对于初学者,我认为您有一个a字符串,而不是字符串数组开始。split本质上是使用分隔符作为分隔符将长字符串剪切成字符串数组。startsWith基本上回答项目yo是否正确您正在查看与您正在查找的模式相匹配的字符串。如果startsWith返回true,您可以将该字符串添加到新数组(在我的示例中已过滤)或拆分为更多更小的块。我一直在尝试实现我被告知的内容,但我看不到如何放置arraylist(gps)它将所有gps数据都包含在您向我展示的拆分方法中。我不知道如何给它们gps arraylist。您的“arraylist(gps)”是实际的Java arraylist吗?在这个问题中,您似乎已经打印出了
toString()
但是底层类型是什么。如果您实际上只得到一个包含所有数据的字符串,那么您可以使用
split()
方法将其拆分为逗号,然后以类似于我上面建议的方式在数组上循环。它是文本文件中单个字符串的arraylist,该文本文件已正确格式化为一个句子,每行以$开头。加载到arraylist中后,我可以将其拆分为单独的字符串。我已更新了我的答案,以便使用您建议使用数据。但是,听起来您可能希望查看如何从文件中加载数据。如果使用
BufferedReader
,您可以从文件中一次读取一行。或者如果数据确实是一个普通的CSV文件,请使用类似于执行读取的操作。。