分裂一个arraylist并再次合并它们

时间:2012-10-04 16:02:28

标签: java oop arraylist user-defined-types

我创建了一个名为OutlierInfo的类,如下所示

public class OutlierInfo 
{
    public String month;
    public int year;
    public String id;
    public int serialId;

    public void setSerialId(int serialid)
    {   
        serialId=serialid;   
    }

    public void setMonth(String monthh)
    {   
        month=monthh; 
    }

    public void setYear(int yearr)
    {    
        year=yearr;  
    }

    public void setId(String idd)
    {        
        id=idd;   
    }   
}

Ad我有一个Outlierinfo类型的arraylist。我已经将一些OutlierInfo对象添加到了arraylist中。现在我要做的是根据他们的SerialId对对象进行分组,制作每个组的arraylist然后合并组的所有arraylists 这是我写的代码,但它只是抛出错误,我不知道为什么。我需要一些帮助,找出为什么下面的代码给出错误?

public class ArraylistSort 
{
    ArrayList<OutlierInfo> result = new ArrayList();
    static ArrayList<ArrayList<OutlierInfo>> groupResult = new ArrayList<ArrayList<OutlierInfo>>();
    String[] months = { "JAN", "FEB", "MAR", "APR"  ,
                        "MAY", "JUN", "JUL", "AUG"  ,
                        "SEP", "OCT", "NOV", "DECM"
                      };
    int counter=0;
    int count=0;   

    public ArraylistSort(){

        for(int i=0;i<2;i++)   
        {
            for(int j=0;j<4;j++)
            {     
                int year=2000+j;
                OutlierInfo o=setValues(i,months[j],year);
                result.add(o);
                System.out.println("result size"+result.size());
            }
        }

        while(result.size()!=0)
        {      
            OutlierInfo info1=new OutlierInfo();
            info1=result.get(counter);
            ArrayList<OutlierInfo> partialInfo=new ArrayList();

            for(int j=1;j<count;j++)
            {      
                OutlierInfo info2=new OutlierInfo();
                info2=result.get(j);
                if(info1.serialId==info2.serialId)
                {   
                    partialInfo.add(info2);
                    result.remove(info2);
                }                                                  
            }

            partialInfo.add(info1);
            System.out.println("partiainfosize"+partialInfo.size());
            groupResult.add(partialInfo);
            result.remove(info1);
            System.out.println("r size "+result.size());
        }

        count=result.size();
    }

    private OutlierInfo setValues(int id,String month,int year)
    {
        OutlierInfo a = new OutlierInfo(); 
        a.setSerialId(id);
        a.setMonth(month);
        a.setYear(year);

        return a;
    }

    public static void main(String[] args)
    {
        ArraylistSort as=new ArraylistSort();
    }
}

我收到以下错误:有人可以帮我理解错误吗?我有任何逻辑错误吗?

initial size 0
result size1
result size2
result size3
result size4
result size5
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
result size6
result size7
result size8
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at STAnalysis.ArraylistSort.<init>(ArraylistSort.java:56)
    at STAnalysis.ArraylistSort.main(ArraylistSort.java:98)
Java Result: 1

更新

我目前面临的最大困惑是,当我实际向arraylist添加对象时,会抛出错误“index out of bounds”!

更新

我修好了。转过来我搞砸了curleybraces.My最终代码

public class StAnamoliesSequencer 
{
    ArrayList<OutlierInfo> stAnomalies =new ArrayList();//arraylist of spatio-temporal outliers
    ArrayList<ArrayList<OutlierInfo>> sequencedStAnomalies=new ArrayList<ArrayList<OutlierInfo>>();
    int firstElement;

    public StAnamoliesSequencer()
    {
         firstElement=0;      
    }


    public ArrayList<ArrayList<OutlierInfo>> sequenceStAnomalies(ArrayList<OutlierInfo> sTanomalies)
    {      

         int loopSizeDeterminer;//determines teh size of the inner loop and is dynamic.

        for(int index=0;index<sTanomalies.size();index++)
        {  
            OutlierInfo stOutlier=new OutlierInfo();
            stOutlier=sTanomalies.get(index);
            stAnomalies.add(index, stOutlier);
        }

           loopSizeDeterminer=stAnomalies.size();

           while(stAnomalies.size()!=0)
             {      
                   OutlierInfo stOutlier1=new OutlierInfo();
                   ArrayList<OutlierInfo> tracker=new ArrayList();//arraylist that stores the grouped Outliers to be deleted later
                   stOutlier1=stAnomalies.get(firstElement);
                   ArrayList<OutlierInfo> similarOutlier=new ArrayList();//similaroutliers are kept in an arraylist
                   similarOutlier.add(stOutlier1);
                   tracker.add(stOutlier1);

                for(int index=1;index<loopSizeDeterminer;index++)
                {    
                     OutlierInfo stOutlier2=new OutlierInfo();
                     stOutlier2=stAnomalies.get(index);

                               if(stOutlier1.serialId==stOutlier2.serialId)
                               {  
                                   similarOutlier.add(stOutlier2);
                                   tracker.add(stOutlier2);
                               }

                }


                System.out.println("partiainfosize \t"+similarOutlier.size());

                sequencedStAnomalies.add(similarOutlier);//adding arraylist of similar outliers to the arraylist of arraylist

                for(int index=0;index<tracker.size();index++)
                {
                     OutlierInfo groupedOutlier=new OutlierInfo();
                     groupedOutlier=tracker.get(index);
                     stAnomalies.remove(groupedOutlier);//grouped outliers are removed from original arraylist containing spatio-temporal outliers to reduce redundancy
                }

                System.out.println(" size "+stAnomalies.size());
                loopSizeDeterminer=stAnomalies.size();




    }
        return sequencedStAnomalies;
    }
}

4 个答案:

答案 0 :(得分:1)

请仔细阅读:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

自1970年以来java和大多数现代编程语言中的数组索引:)从0开始。如果你的数组长度为6个元素,则其索引必须在0 ... 5的范围内。

我希望您现在有足够的信息来调试代码并找到错误。

答案 1 :(得分:1)

嘿,我运行你的代码并检查它。 这是输出

result size1
result size2
result size3
result size4
result size5
result size6
result size7
result size8
partiainfosize1
r size 7
partiainfosize1
r size 6
partiainfosize1
r size 5
partiainfosize1
r size 4
partiainfosize1
r size 3
partiainfosize1
r size 2
partiainfosize1
r size 1
partiainfosize1
r size 0

检查其他IDE,如果您使用eclipse(尝试使用Netbeans)并检查是否仍有错误

答案 2 :(得分:0)

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

表示您有一个大小为6的arraylist,并且您正在尝试访问第6个索引处的元素。 哪个错误

请记住,arraylist索引是零索引的。所以,如果您的arraylist大小为6,那么要访问第6个元素,您应该这样做

al.get(5).

我的猜测是,你的计数是6,所以你的循环应该是

 for(int j=0;j<count-1;j++)
                {      
                     OutlierInfo info2=new OutlierInfo();
                     info2=result.get(j);

         /// continue your code

答案 3 :(得分:0)

您正在获取索引超出范围的异常,这几乎总是程序员错误。但是我拿了你确切的发布代码,它没有例外。我意识到你的错误说ArrayListSort.java:98中的错误所以第98行你发布的类只有59行!因此,您运行的是自己类的错误版本,请确保运行您发布的版本。这就是问题所在。

我的结果来自未经修改的运行您的POSTED代码

结果大小1 结果大小2 结果大小3 结果大小4 结果大小5 结果大小6 结果大小7 结果大小8 partiainfosize1 r大小7 partiainfosize1 r大小6 partiainfosize1 大小为5 partiainfosize1 r大小4 partiainfosize1 r大小3 partiainfosize1 r大小2 partiainfosize1 r大小1 partiainfosize1 r size 0