在浏览器历史记录系统中乘以循环

时间:2015-04-21 14:05:18

标签: java csv for-loop methods

我想,我一直在为一个项目编写一个Web浏览器,我发现我无法使我的历史系统按预期工作,此时此刻我发现我的历史项目正在复制,我的历史基于for循环样式金字塔在会话之间重复自身,其中金字塔的大小是我上次访问的页数的n-1:

页面重复|上次访问过的页面

    1                        1
    12                       2
    123                      3
    1234                     4

每当我前往新页面时都会调用此方法,并且上半部分中的if语句仅运行一次,此时浏览器已启动并且可以从存储的CSV文件中恢复以前会话的历史记录。 / p>

代码应该在每次访问页面时创建一个jmenuitem,然后将其添加到jmenu,这样做很好,但是,它也应该将链接添加到列表中。然后将该列表附加到csv进行存储。

public class FileBar extends JMenuBar {
    int tracker = 0;
    File histPath = new File("history.csv");
    JMenu history = new JMenu("History");
    List<String> histStore = new ArrayList<String>();

    public void createhistory(String webAddress) {
        try {
            List<String> histFeedback = new ArrayList<String>();
            writer = new FileWriter(histPath, true);
            if (tracker < 1) {
                  // system to retrieve information from csv file upon launch of program
            }       

            JMenuItem button = new JMenuItem(webAddress);
            history.add(button);
            button.addActionListener(new ActionListener() {
               // ...
            });

            histStore.add(webAddress);
            int i = 0;
            for (i = 0; i < histStore.size(); i++) {

                writer.append(histStore.get(i));
                writer.append(",");
            }

            writer.flush();
        } catch (Exception e) {}
    }
}

2 个答案:

答案 0 :(得分:1)

好的,这就是问题(我认为)。每次访问某个页面时,您似乎都整个历史记录附加到CSV中的行

我不知道f.histStore来自何处,但我认为它是从CSV中的行创建的。因此,如果CSV中有5个地址,那么它似乎是f.histStore.size() == 5

因此,当您转到某个页面时,会将该地址附加到f.histStore

f.histStore.add(webAddress);

好的,到目前为止看起来很好。但是,您 f.histStore追加到最初读取的行:

for (i = 0; i < f.histStore.size(); i++) {
    writer.append(f.histStore.get(i));
    writer.append(",");
}

因此,您已将整个列表附加到现有列表中。因此,这会导致重复的模式,例如abc是地址:

a
aab
aabaabc

如果发生了什么,那么这是一个简单的解决方案:只将最后一个地址写入文件。用以下代码替换写循环:

int lastIndex = f.histStore.size() - 1;
writer.append(f.histStore.get(lastIndex));
writer.append(",");

这样做吗?如果没有,输出的错误是什么?

答案 1 :(得分:0)

假设您的csv中出现金字塔问题,似乎正在发生的事情是您每次访问页面时都会将历史列表写入csv。您访问的第一页将页面附加到列表,然后将其写入csv。您访问的第二页将页面附加到列表,然后将完整列表写入csv,因为此代码:

for (i = 0; i < f.histStore.size(); i++) {

    writer.append(f.histStore.get(i));
    writer.append(",");
}

您需要覆盖csv中的行,或者只是附加最近的项目。