1

在阅读下面的评论并按照建议进行单元测试后,我正在编辑这篇文章。以下是我的程序的简要说明:

  1. 给定一个仅包含字母 A、G、C、T 的输入字符串。字符串的长度通常为 80-100K。
  2. 我必须确定符合某些标准的区域(至少 200 个长度)。我正在使用滑动窗口算法。(示例:输入字符串:abcdef,输入宽度 = 3,滑动窗口字符串将为 abc、bcd、cde、def、ef。在我的情况下,输入宽度 = 200)。我创建了一个函数来执行此操作,并将字符串的开始和结束间隔保存在整数列表中。因此,假设我的列表类似于 (30,230, 40, 240, 60, 260, 300,500, 450,650),其中 30,40,60,300,450 是满足特定标准的开始间隔,其余数字是结束间隔。
  3. 下一步是识别附近的那些间隔(距离为 100)并将它们组合在一起。我已经做到了。现在我的列表是 (30,260, 300,500, 450,650)。
  4. 我的最后一步是在这些间隔上重新运行标准,以确保它们仍然符合要求。这就是我遇到问题的地方。这是我的代码:

    public static List<Integer> finalCPGIslands(List<Integer> iList,
        String iSeq, int width) {
    // Declare output list that contains final list of start and end
    // intervals
    List<Integer> oList = new ArrayList<Integer>();
    // Add the first two elements anyways
    oList.add(iList.get(0));
    oList.add(iList.get(1));
    if (iList.size() > 2) {
        for (int i = 2; i < iList.size(); i += 2) {
            // The below IF is attempted to ensure that substring is always
            // valid
            if (iSeq.length() > iList.get(i + 1)) {
                // While creating the substring in next line, I get String
                // index out of range: -9
                String testSeq = iSeq.substring(iList.get(i),
                        iList.get(i + 1) + 1);
                boolean check = cpgCriteriaCheck(testSeq);
                if (check) {
                    // If condition is met, add the indexes to the final
                    // list
                    oList.add(iList.get(i));
                    oList.add(iList.get(i + 1));
                }
                // If condition is not met, start removing one character at
                // a time until condition is met
                else {
    
                    int counter = 0;
                    int currentSequenceLength = testSeq.length();
                    String newTestSeq = null;
                    while (counter <= currentSequenceLength) {
                        counter++;
                        if (testSeq.length() > 2) {
                            newTestSeq = testSeq.substring(1,
                                    testSeq.length() - 1);
                            testSeq = newTestSeq;
                            if (newTestSeq.length() < width) {
                                counter = currentSequenceLength + 1;
                            } else {
                                boolean checkAgain = cpgCriteriaCheck(newTestSeq);
                                // If condition met, add the item to list
                                // and exit
                                if (checkAgain) {
                                    oList.add(iList.get(i) + counter);
                                    oList.add(iList.get(i + 1) - counter);
                                    counter = currentSequenceLength + 1;
                                }
    
                            } // End of Else
                        } // End of IF
    
                    } // End of While
                } // End of Else
            }
    
        } // End of For
    } // End of Else
    return oList;
    

    }

在此函数中,输入参数是包含开始和结束间隔的整数列表、我的输入字符串以及作为开始和结束间隔之间的最小差的整数差。当我尝试在下面的以下行中创建一个子字符串时,我得到一个字符串超出范围:-9 异常:

String testSeq = iSeq.substring(iList.get(i),
                        iList.get(i + 1) + 1);

此外,此异常只是间歇性地出现。我有一个大约 95K 个字符的输入文件,并且没有发生此异常。我认为通过放置一个 IF 语句,我检查以确保字符串长度大于输入列表值,我涵盖了这个异常。另外,-9 表示什么?这是否表明字符串中的第 9 个字符无效?即使我通过删除所有 /r 和 /n 出现来清理字符串,是否有可能导致此问题的任何不需要的字符。抱歉太冗长了,但我想给出这个问题的背景。根本原因似乎仍然只是创建子字符串时的字符串索引超出范围异常。

4

1 回答 1

0

通过添加以下行解决了 String OOB 异常。这涵盖了创建子字符串时可能发生的所有错误情况。
if (str != null && from >= 0 && to >= from && to <= str.length()) { }

于 2013-11-02T00:36:36.750 回答