【问题标题】:List collections interface in javajava中的列表集合接口
【发布时间】:2011-11-29 21:51:36
【问题描述】:

请在我的代码中找到以下函数:

    private static List<String> formCrfLinesWithMentionClass(int begin, int end, String id, 
        List<String> mList, int mListPos, List<String> crf) {
    List<String> crfLines = crf;
    int yes = 0;
    mListPosChanged = mListPos;
//--------------------------------------------------------------------------
    for (int crfLinesMainIter = begin; crfLinesMainIter < end; ) {
        System.out.println(crfLines.get(crfLinesMainIter));
//---------------------------------------------------------------------------
        //the total number of attributes without orthographic features
        //in a crfLine excluding the class attribute is 98
        if (!crfLines.get(crfLinesMainIter).equals("") && crfLines.get(crfLinesMainIter).split("\\s").length == 98) {
            //in mList parenthesis are represented by the symbol
            //in crfLines parenthesis are represented by -LRB- or -RRB-
            //we make a check to ensure the equality is preserved
            if(val.equals(crfLines.get(crfLinesMainIter).split("\\s")[0])) {                 
                yes = checkForConsecutivePresence(crfLinesMainIter, mList, mListPos, id, crfLines);
                if (yes > 0) {
                    mListPosChanged += yes;
                    System.out.println("formCrfLinesWithMentionClass: "+mListPosChanged);
                    for (int crfLinesMentionIter = crfLinesMainIter; 
                            crfLinesMentionIter < crfLinesMainIter + yes; 
                            crfLinesMentionIter++) {
                        String valString = "";
                        if (crfLinesMentionIter == crfLinesMainIter) {
                            valString += crfLines.get(crfLinesMentionIter);
                            valString += " B";
                            crfLines.add(crfLinesMentionIter, valString);             
                        }
                        else {
                            valString += crfLines.get(crfLinesMentionIter);
                            valString += " I";                                
                            crfLines.add(crfLinesMentionIter, valString);
                        }
                    }
                    crfLinesMainIter += yes;
                }
                else {
                    ++crfLinesMainIter;
                }
            }
            else {
                ++crfLinesMainIter;
            }
        }
        else {
            ++crfLinesMainIter;
        }
    }
    return crfLines;
}

我面临的问题如下: crfLines 是一个列表集合接口。 当 for 循环(在 //----- 之间)开始时, crfLines.get(crfLinesMainIter) 工作正常。但是一旦进入if并对其进行其他处理,即使“crfLinesMainIter”改变了crfLines.get(crfLinesMainIter)似乎得到了某个先前的值。它不会在索引处检索实际值。有没有人遇到过这样的情况?谁能告诉我为什么会这样?


我的实际问题是,即使索引可能不同,list.get() 函数何时仍会检索之前位于另一个索引处的值?

例如:

List crfLines = new LinkedList();

如果 crfLinesMainIter = 2

crfLines.get(crfLinesMainIter) 给我带来一个值 20,这个值 20 满足 if 循环条件。然后进行进一步的处理。现在,当 for 循环执行时 crfLinesMainIter 的值变为 5。在这种情况下,crfLines.get(5) 实际上应该给我带来一个不同的值,但它仍然给我带来了之前的值 20。

【问题讨论】:

  • 代码倒转并不能说明它有多棒......我发现乍一看很难理解这段代码。
  • 你遇到的问题不清楚,不知道这个方法是做什么用的。您是否使用调试器单步执行了代码?这可能会引导您解释问题。
  • 你在哪里学习到如何使用这样的 for 循环?这是我第一次见到。

标签: java list indexing


【解决方案1】:

(不是答案。)

重新设计(或多或少)以提高可读性:

private static List<String> formCrfLinesWithMentionClass(int begin, int end, String id, List<String> mList, int mListPos, List<String> crf) {
    List<String> crfLines = crf;
    mListPosChanged = mListPos;

    int i = begin;
    while (i < end) {
        if (crfLines.get(i).equals("") || (crfLines.get(i).split("\\s").length != 98)) {
            ++i;
            continue;
        }

        if (!val.equals(crfLines.get(i).split("\\s")[0])) {
            ++i;
            continue;
        }                 

        int yes = checkForConsecutivePresence(i, mList, mListPos, id, crfLines);
        if (yes <= 0) {
            ++i;
            continue;
        }

        mListPosChanged += yes;
        for (int j = i; j < i + yes; j++) {
            String valString = crfLines.get(j);
            valString += (j == i) ? " B" : " I";
            crfLines.add(j, valString);             
        }
        i += yes;
    }

    return crfLines;
}
  • 什么是mListPostChanged?我发现它被设置为名为@9​​87654323@ 的参数的值令人困惑——这让我觉得m 前缀毫无意义。
  • 包含split 的行中的val 是什么?

【讨论】:

  • 我的主要问题是,crfLines.get(i) 怎么不能给我带来索引值?
  • @rookie 可以;它会返回任何String 在你给它的索引位置。您确定该列表包含您认为的内容吗?您确定 beginend 值是您认为的值吗?你确定i 是你认为的那样吗?这就是代码难以推理的问题——很难回答这些问题。如果您不打算使代码更清晰,我建议您逐步执行一些循环迭代。
  • 很抱歉代码不干净。它是一个非常大的程序。我相信我会进入循环迭代。我很确定索引值是什么,并且我确定不同索引值的内容是不同的。是否有可能因为它是一个链表,如果我在特定索引处向它添加值,当它返回 for 循环时它会丢失索引方向?
  • @rookie 如果您要更改您正在迭代的列表,是的,这会弄乱您的索引,具体取决于您在哪里插入东西。一般来说,你要非常小心地做这样的事情。
  • 戴夫,我实际上需要使用 LinkedList.set(i, val) 而不是 LinkedList.add(i, val)。它解决了这个问题。感谢您的意见,即使问题不是很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多