拆分数组列表并再次合并它们

Posted

技术标签:

【中文标题】拆分数组列表并再次合并它们【英文标题】:Splitting an arraylist and merging them back again 【发布时间】:2012-09-25 17:23:08 【问题描述】:

我创建了一个名为 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;   
       

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

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

更新

目前面临的最大困惑是,当我实际将对象添加到数组列表时,会引发错误“索引超出范围”!

更新

我修好了。原来我把花括号弄乱了。我的最终代码

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;
    

【问题讨论】:

【参考方案1】:

请仔细阅读:

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

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

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

【讨论】:

我知道。我基本上是动态地将对象添加到这个数组列表中,因此数组列表的大小正在增加,因为我在这里添加了 8 个对象到这个 arralist 它的大小必须是 8 所以为什么当程序试图访问第 6 个对象时出现异常?酷我不知道这种索引是从 1970 年开始的:)【参考方案2】:

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

结果大小1 结果大小2 结果大小3 结果大小4 结果大小5 结果大小6 结果大小7 结果大小8 部分信息大小1 尺码 7 部分信息大小1 尺码 6 部分信息大小1 尺码 5 部分信息大小1 尺码 4 部分信息大小1 r 尺寸 3 部分信息大小1 尺码 2 部分信息大小1 尺码 1 部分信息大小1 r 大小 0

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

【讨论】:

【参考方案3】:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

说您有一个大小为 6 的数组列表,并且您正在尝试访问第 6 个索引处的元素。 错了

请记住,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

【讨论】:

谢谢你:) 但我的问题几乎不是那个(至少我是这么认为的)或者可能是我误解了不知道。【参考方案4】:

你得到一个索引越界异常,这几乎总是程序员的错误。但是,我采用了您发布的确切代码,它运行良好,没有例外。我意识到您的错误在 ArrayListSort.java:98 中显示错误,因此第 98 行您发布的类只有 59 行!因此,您正在运行自己课程的错误版本,请确保您正在运行您发布的课程。这就是问题所在。

我在未修改的情况下运行您发布的代码的结果

结果大小1 结果大小2 结果大小3 结果大小4 结果大小5 结果大小6 结果大小7 结果大小8 部分信息大小1 尺码 7 部分信息大小1 尺码 6 部分信息大小1 尺码 5 部分信息大小1 尺码 4 部分信息大小1 r 尺寸 3 部分信息大小1 尺码 2 部分信息大小1 尺码 1 部分信息大小1 r 大小 0

【讨论】:

嘿,为了清楚起见,我在发布时删除了一些 cmets :) 并且我还删除了一些基本上打印内容的行。我没有看到任何逻辑错误,但我只是不断收到 ^array 越界错误^感谢您运行代码并发布结果。我不知道为什么我不断收到该错误

以上是关于拆分数组列表并再次合并它们的主要内容,如果未能解决你的问题,请参考以下文章

展平和合并数组,然后将它们拆分回来

如何合并、拆分和查询第 k 个排序列表?

拆分所有列表框元素并将它们全部添加到新的字符串数组中

如何将字符串拆分为列表并在python中将两个已知令牌合并为一个?

我有两个numpy数组列表,我希望将它们合并为一个numpy数组列表

试图让文本文件的每一行成为一个数组列表