0

我正在尝试遍历一些字符串数组列表以匹配元素,但我收到一个错误,即我的数组长度不同。我有一个数组列表,里面有一堆样本,第二个只有几个样本。我希望搜索第一个数组列表,同时将它们与第二个数组中的值进行比较和匹配。当我找到两个数组列表匹配的位置时,我想获取第一个的索引并将其应用于第三个,它包含与样本协调的手段(作为提醒,它们存储在第一个中。)我有包含导致问题所在的代码,但已尝试使其尽可能简洁。本质上,我希望有人可以解释我遇到的错误,或者更好的比较它们的方法。

//this is how they are declared
ArrayList<String> pit = new ArrayList<String>(); int h =0;
...etc...
//a file is read in
while((sLine=inpt.readLine())!=null){
      splitn=sLine.split(delim2);
      //splits the file into two different ArrayLists, names and means
      pit.add(splitn[0]); pit2.add(splitn[2]);
}
String b="mean"; int pitn = 0;
//remove column titles from those two lists
while(pitn<pit.size()){
     if(pit2.get(pitn).equals(b)){
        pit.remove(pitn); pit2.remove(pitn);
     }
     else{
          ++pitn;
     }
}
//match a pattern to the file names that were entered
ArrayList<String> sampleNum = new ArrayList<String>();          
for(String inp : filenames) {
     Matcher matt=patt.matcher(inp);
     while(matt.find()){
           if(matt.groupCount() >= 2) {
              //match the first part of the file name
              samplenum = matt.group(1);
              //match the second grouping to paneltype
              paneltype = matt.group(2);
           }
           //add sample names to another arraylist
           sampleNum.add(samplenum);
     }
    **//I wish to search through the pit values for a place where it matches sampleNum
    //Problematically I am getting an error
    //for the length of pit** 
     for(int inx=0;inx<pit.size();inx++){
        //if the value of pit equals the value of sampleNum
        if(pit.get(inx).equals(sampleNum.get(h))){
           //add the value, of the same index, from pit2 to the mncov arraylist
           mncov.add(pit2.get(inx));
           h++;
        }
     }

java.lang.IndexOutOfBoundsException:索引:2,大小:2

我正在输入 2 个文件,所以这是有道理的,因为 sampleNum 取自文件名。2 个文件 = 2 个文件名

at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at consistentbelow.ConsistentBelow.main(ConsistentBelow.java:**72**) 

72行是这一行:

(pit.get(inx).equals(sampleNum.get(h))){

所以我完全不确定这里有什么问题。我觉得我错过了一些明显的东西,但已经考虑到了盲目的程度。我认为我提供了足够的信息来获得一些帮助,但如果有帮助的话,我不会哀叹提供更多信息。

4

1 回答 1

1

我认为你的问题不是大小的问题,pit而是大小的问题sampleNum。每次找到匹配项时您都在递增h,但没有什么能阻止 h 递增到高于 sampleNum 的总长度(即所有内容都已匹配并且它一直在尝试匹配)。快速修复可能是这样的

for(int inx=0; inx<pit.size() && h < sampleNum.size(); inx++){
    if(pit.get(inx).equals(sampleNum.get(h))){
       //add the value, of the same index, from pit2 to the mncov arraylist
       mncov.add(pit2.get(inx));
       h++;
    }
}

不是最优雅的修复,但应该消除我认为的错误。我还怀疑这可能与您期望的输出不完全一样,但是如果不更好地了解您要做什么,就很难说。

于 2012-09-04T20:02:20.720 回答