【问题标题】:multiplying for loop in a browser history system在浏览器历史系统中乘以 for 循环
【发布时间】:2015-04-21 14:05:18
【问题描述】:

我想,我一直在为一个项目编写一个网络浏览器,但我发现我无法让我的历史系统按预期工作,目前我发现我的历史项目正在复制,我的历史基于 for-loop 风格的金字塔在会话之间复制自身,其中金字塔的大小是我上次访问的页面数的 n-1:

页面重复 |上次会话访问的页面

    1                        1
    12                       2
    123                      3
    1234                     4

每当我进入一个新页面并且上半部分的 if 语句只运行一次时,当浏览器启动并且在那里从它存储的 CSV 文件中恢复上一个会话的历史记录时,就会调用此方法。

该代码应该在每次访问页面时创建一个 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) {}
    }
}

【问题讨论】:

  • 那是很多代码。是否可以进行更多测试,看看您是否可以缩小问题所在,然后修改问题以仅包含该部分(并描述确切的问题)?
  • @br1ckb0t 我已经尽我所能,但我认为我们失去了代码现在试图做的事情的本质......第一段也准确地说明了我的代码有什么问题,我的历史会在基于 for 循环样式金字塔的会话之间复制,其中金字塔的大小是我上次访问的页面数的 n-1
  • 太好了,谢谢。这很有帮助。该代码现在有意义,但我不确定问题是否在这里。所以只是为了澄清 - 你能在你的开头段落中澄清问题出在哪里吗?是f.histStore,csv,还是别的什么地方?
  • @br1ckb0t 我已经更新了问题,并且在另一条评论中详细说明了一些细微的代码更改,但是我仍然无法使其工作,请您建议?
  • 知道了@BenBowen。检查我的答案 - 这是怎么回事?

标签: java csv for-loop methods


【解决方案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(",");
}

因此,您已将整个列表附加到现有列表中。所以这会导致重复的模式,就像这样,a、b 和 c 是地址:

a
aab
aabaabc

如果发生这种情况,有一个简单的解决方案:只将最后一个地址写入文件。将写循环替换为:

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

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

【讨论】:

  • 我不得不对另一段代码进行一些编辑,也是 f.无关紧要,因为它指的是课程本身,并且是我在将问题发布到堆栈时忘记清理的剩余代码,但是因为您一直愿意且乐于助人,并且因为您引导我回答了我的问题,所以谢谢您和答案标记
  • 太棒了,谢谢!很高兴你能弄明白——尤其是因为你自己弄明白是最好的学习方式:)。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我将那部分代码更改为:int i = 0; writer.append(histStore.get(i)); writer.append(","); i++; 但是现在该方法根本不写
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 2015-10-10
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多