从arraylist中删除字符串 [英] Removing string from arraylist

查看:86
本文介绍了从arraylist中删除字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果不是以13开头的字符串,我需要从数组列表中删除字符串.我已经读入数据文件,并且每一行都作为字符串读入ArrayList.如果不是以13开头,则需要删除整行.下面显示了读入数据文件的示例:

I need to remove a string from an array list if it does not start with 13. I have read in the data file and each line is read into the ArrayList as a string. The whole line needs to be removed if it does not start with 13. Below shows an example of the data file read in:

13 0 150801 00133990 04 04 1 078 2160 999 1 0 1 0 16 04 07 058 0320 061 0127 068 0546 033 0129 048 0586 042 0133 033
13 0 150801 00140480 04 04 1 086 1730 999 1 0 1 0 13 04 06 047 0309 039 0143 032 0772 017 0131 029 0140 037
13 0 150801 00141320 04 04 1 075 1660 999 1 0 1 0 13 03 06 053 0319 036 0132 037 0733 023 0130 026 0134 029
13 0 150801 00144430 01 01 1 071 1570 999 2 0 1 0 04 03 02 040 0567 065
30 0 150801 0015 15 01 0000 0000 0004 0000 0001 0002 0000 0000 0000 0000 0000 0000 0001 0001 0000 0000 0008 0000
30 0 150801 0015 15 02 0000 0000 0005 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
30 0 150801 0015 15 03 0000 0000 0013 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
30 0 150801 0015 15 04 0000 0000 0021 0000 0000 0001 0001 0000 0000 0001 0000 0000 0000 0006 0000 0000 0007 0001
21 0 150801 0015 15 01 0002 0001 0005 0004 0003 0001 0001 0000 0000 0000 000973 002 001 010 0001 0001
21 0 150801 0015 15 02 0000 0000 0000 0001 0001 0002 0000 0001 0000 0000 000000 000 000 000 0001 0001
21 0 150801 0015 15 03 0000 0001 0000 0000 0001 0004 0003 0001 0002 0001 000000 000 000 000 0003 0003
21 0 150801 0015 15 04 0000 0002 0009 0008 0007 0002 0006 0004 0000 0000 001252 000 004 012 0001 0003
70 0 150801 0015 15 01 0004 0000 0012 0001 00001400 00000000 00005956 00000476 000412 000000 000897 000076 000042542 000000000 000068665 000005776
70 0 150801 0015 15 02 0005 0000 0000 0000 00001790 00000000 00000000 00000000 000511 000000 000000 000000 000053047 000000000 000000000 000000000
70 0 150801 0015 15 03 0011 0002 0000 0000 00003648 00000625 00000000 00000000 001240 000231 000000 000000 000144378 000026705 000000000 000000000
70 0 150801 0015 15 04 0021 0001 0015 0001 00007334 00000417 00006991 00000449 002203 000086 001172 000080 000235235 000007396 000092708 000006400
13 0 150801 00151590 04 04 1 078 2240 999 1 0 1 0 16 04 07 064 0318 073 0137 071 0545 083 0137 079 0604 066 0133 067
13 0 150801 00155070 01 01 1 078 1760 999 1 0 1 0 13 04 06 059 0324 054 0135 060 0643 022 0133 028 0127 049
13 0 150801 00160780 01 01 1 080 2230 999 1 0 1 0 16 04 07 057 0374 059 0132 059 0724 064 0138 066 0456 052 0138 063
13 0 150801 00162180 04 04 1 063 1820 999 1 0 1 0 16 04 07 058 0264 082 0113 081 0474 079 0113 080 0501 069 0113 070

这是我写的,但似乎没有任何项目被删除:

This is what I have written but it doesn't seem like any items are deleted:

public class WIMdataReader {
    public static void main(String[] args) throws IOException {

        //Opens the file
        FileInputStream fis = new FileInputStream("DATA1month.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));

        String readLine;

        //Creates an ArrayList to store the data line by line
        //Using an ArrayList, which handles dynamic sizing, whereas an array will require a defined size up front, which may not be known.
        List<String> WIMdataList = new ArrayList<String>();

        //Reads file line by line
        while ((readLine = br.readLine()) != null) {
            WIMdataList.add(readLine);
        }

        //removes items from the arrayList 
        for (int i = 0; i < WIMdataList.size(); i++) {

            if (WIMdataList.get(i).contains("13")) {

            } else {
                WIMdataList.remove(i);
            }
        }
    }
}

推荐答案

如果要从列表中删除内容,并按索引进行迭代,请向后迭代.否则,您永远不要在刚删除的项目之后立即检查该项目,因此即使符合您的条件,也不会将其删除.

If you're removing things from the list, and iterating by index, iterate backwards. Otherwise, you never check the item immediately after the one you've just removed, and thus you won't remove it, even if it meets your criteria.

for (int i = WIMdataList.size() - 1; i >= 0; --i) {
  if (!WIMdataList.get(i).contains("13")) {
    WIMdataList.remove(i);
  }
}

请注意,从ArrayList的中间重复删除是无效的,因为所有后续元素每次都必须移动.您可以通过以下方法来避免这种情况:迭代 forwards ,然后自己移动元素,并在结尾处截断列表:

Note that repeatedly removing from the middle of an ArrayList is inefficient, because all of the subsequent elements have to be moved along each time. You can avoid this by iterating forwards, and shifting the elements yourself, and truncating the list at the end:

int dst = 0;
for (int src = 0; src < WIMdataList.size(); ++src) {
  if (WIMdataList.get(src).contains("13")) {
    WIMdataList.set(dst++, WIMdataList.get(src));
  }
}
WIMdataList.subList(dst, WIMdataList.size()).clear();

但是使用removeIf会更容易:

WIMdataList.removeIf(s -> !s.contains("13"));

或过滤器,以创建新列表:

Or a filter, to create a new list:

List<String> filtered = WIMdataList.stream().filter(s -> s.contains("13")).collect(Collectors.toList());

或者,当然,首先不要将它们添加到列表中.

Or, of course, just don't add them to the list in the first place.

这篇关于从arraylist中删除字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆