为什么我不能清除ArrayList的两个子列表

时间:2013-09-21 23:58:42

标签: java xml eclipse arraylist sublist

在我的班级,Main,我正在尝试获取一个xml文件,将其转换为字符串,将其标记化并将其放入数组列表中,然后使用子列表清除大部分ArrayList值,然后清除该子列表,以便我可以摆脱我不需要的数据并保留我需要的数据。这一切都很好,直到我试图清除我不需要的数据。发生的事情是第一个子列表清楚起作用,但第二个子列表清楚没有。我研究和解决了几个小时,找出为什么这不起作用,但我没有想出任何东西。如果它有助于我使用Eclipse Kepler Java EE IDE for Web Developers。

package mccoy.alfred.project;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) {

        try {
            URL url = new URL("http://themoneyconverter.com/rss-feed/USD/rss.xml");
            InputStream stream = url.openStream();
            BufferedInputStream buf = new BufferedInputStream(stream);
            StringBuilder sb = new StringBuilder();
            ArrayList<String> tokenList = new ArrayList<String>();
            int tokenNum = 0;

            while (true) {
                int data = buf.read();

                if (data == -1) {
                    break;
                }
                else {
                    sb.append((char)data);
                }

            }

            String xmlFile = sb.toString();
            StringTokenizer st = new StringTokenizer(xmlFile);
            System.out.println("tokens count: " + st.countTokens());

            while (st.hasMoreElements()) {
                String token = st.nextElement().toString();
                tokenList.add("Token " + tokenNum + " = " + token);
                tokenNum++;
            }

            tokenList.set(64, "Token 64 = Dirham");
            tokenList.subList(0, 56).clear();
            tokenList.subList(65, 77).clear();

            System.out.println(tokenList);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我会把代码输出到控制台,但它很长。同样,代码中不起作用的部分是:

tokenList.subList(0,56).clear();
tokenList.subList(65,77).clear();

此外,如果它有帮助,我计划添加更多子列表并清除它们,如果有人可以解决这个问题。感谢您忍受长篇帖子,并提前感谢您帮助我!

2 个答案:

答案 0 :(得分:2)

问题是订单:

tokenList.subList(0, 56).clear();
tokenList.subList(65, 77).clear();

删除前57个元素,索引64到76的元素现在位于索引9到21中。

如果您只是要删除两个块,只需交换订单,以便先触摸列表的末尾。

tokenList.subList(65, 77).clear();
tokenList.subList(0, 56).clear();

答案 1 :(得分:0)

我猜你没有考虑到从列表中删除元素会改变列表大小以及删除范围之后所有元素的位置这一事实。

例如:

        tokenList.set(64, "Token 64 = Dirham");
        tokenList.subList(0, 56).clear();

此时,"Token 64 = Dirham"列表中的位置为8 ...而不是64

        tokenList.subList(65, 77).clear();

如果这样成功,则在"Token 64 = Dirham" ...

之后不会立即删除该元素