【问题标题】:While loop doesn't seem to be incrementing虽然循环似乎没有增加
【发布时间】:2020-08-05 03:22:10
【问题描述】:

我的代码基本上是这样的:


bufferedReader = new BufferedReader(new InputStreamReader(inputFile));

    while ((currentLine = bufferedReader.readLine()) != null) {

         Document document;
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         document = dBuilder.parse(new InputSource(new StringReader(currentLine)));
         document.getDocumentElement().normalize();
         NodeList nList = document.getElementsByTagName("record");

         int j = 0;
         int k = 0;
         while (j < lines) {
             if (currentLine.contains(bList.get(k))) {
                 myList.add(currentLine);
                 bufferedReader.mark(0);
                 k++;
                 j++;
             }
             else if (myList.size() == bList.size()) {
                 break;
             }
             else {
                 j++;
             }
         }

我有一个 bufferedReader 逐行遍历文件。我想要的是根据该行是否包含 bList 中存在的字符串,将单次出现的行添加到 myList 中。无论出于何种原因,当我调试时,尽管 k++ 递增,bList 都不会移动到下一个索引。我也不确定使用 bufferedReader.mark(0) 是否正确,我之前使用 inputFile.getChannel().position(0);但我遇到了:

'错误:XML 文档结构必须在同一个实体内开始和结束'

我在调试时注意到的另一个问题是,当 myList 和 bList 的大小相等时,while 循环不会中断。相反,myList 一直保持到 34 的大小,而 bList 保持在 2 的大小。

编辑:添加更多行以提供一些上下文和理解

【问题讨论】:

  • 我没有在代码中看到任何向bList 添加任何内容的内容,您为什么期望它会增长?此外,currentLine 永远不会改变,我在任何地方都看不到BufferedReader 呼叫。总而言之,代码似乎与您的描述不符。请你更新一下哪个是错的,好吗?
  • 您的意思是在循环中的某处更新currentLine
  • 能不能把你的xml加进去,方便大家指出,哪里结构不对?
  • @DmitriyPopov 由于 GDPR,我无法添加我的 XML 文件。
  • abidount:不,您发布的代码不会遍历任何内容。没有更新currentLine。如果您的真实代码这样做,那么您需要发布Minimal, Reproducible Example。您“审查”了太多代码,因此争论是没有意义的。

标签: java loops while-loop bufferedreader increment


【解决方案1】:

如果 currentline 不包含 bList @index k 中的任何内容,k 将永远不会增加,因此会卡在这个单词上。

如果 currentline 包含 bList else if (myList.size() == bList.size()) 中的内容,则不会执行,并且您不想使用 break,那只是不好的样式。而是选择while(... &amp;&amp; myList.size() &lt; bList.size())

另外我不明白将同一行多次添加到 myList 背后的逻辑,您可能想遍历其他行。

bufferedReader.mark(0);的目的是什么?

这里有一些代码可以做你想做的:

  LinkedList<String> found = new LinkedList<String>();
  while ((currentLine = bufferedReader.readLine()) != null) {
    foreach(String word : bList){
      if(!found.contains(word) && currentline.contains(word)){
        myList.add(currentLine);
        found.add(word);
        break;      
      }
    }
  }

这会将每一行添加到 myList 第一次包含 bList 中的单词时。 或者,如果您不再需要 bList,您可以从 bList 中删除该单词。

【讨论】:

  • 是的,我明白了,我不希望 k 增加,除非它在 ​​currentLine 中找到,但即使它是,它仍然不会增加。缓冲的阅读器也会遍历整个 XML。 bufferedReader.mark(0) 用于一旦发现 bList(k) 的出现,bufferedReader 从头开始​​。因为它需要在同一个 XML 中找到第一次出现的 bList(k+n)
  • @abiodunt:这根本不是mark 所做的!如果你从不打电话给reset(),那么mark() 实际上什么都不做。此外,正如一遍又一遍地重复:您永远不会从代码中的缓冲阅读器中读取数据
  • @JoachimSauer 我为上下文添加了一些额外的行。另外,我将如何将缓冲的阅读器重置到第 1 行。当调用 reset() 时,我遇到了 >java.io.IOException: Stream notmarked
  • 你甚至不需要那个,你已经逐行阅读了为什么要标记任何东西?
  • @ChristianO。在找到 bList(k) 的出现后,我想让缓冲的阅读器再次从第 1 行开始。我最初使用inputFile.getChannel().position(0);,但遇到了异常。
猜你喜欢
  • 2011-04-17
  • 2014-01-25
  • 1970-01-01
  • 2013-09-23
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多