2

次のように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の配列リストがあります。配列リストにOutlierInfoのオブジェクトをいくつか追加しました。ここで、SerialIdに従ってオブジェクトをグループ化し、各グループの配列リストを作成してから、グループのすべての配列リストをマージする必要があります。これは私が作成したコードですが、エラーが発生するだけで、理由がわかりません。次のコードでエラーが発生する理由を見つけるのに助けが必要ですか?</ p>

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;
    }
}
4

4 に答える 4

1

コードを実行して確認しました。ここに出力があります

結果サイズ1
結果サイズ2
結果サイズ3
結果サイズ4
結果サイズ5
結果サイズ6
結果サイズ7
結果サイズ8
partiainfosize1
rサイズ7
partiainfosize1
rサイズ6
partiainfosize1
rサイズ5
partiainfosize1
rサイズ4
partiainfosize1
rサイズ3
partiainfosize1
rサイズ2
partiainfosize1
rサイズ1
partiainfosize1
r サイズ 0

Eclipse を使用している場合 (Netbeans で試してください)、他の IDE をチェックインし、まだエラーがあるかどうかを確認します。

于 2012-10-04T18:24:47.757 に答える
1

注意深く読んでください:

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

Java および 1970 年以降のほとんどの最新のプログラミング言語の配列インデックス:) 0 から始まります。配列の長さが 6 要素の場合、そのインデックスは 0 ~ 5 の範囲内である必要があります。

コードをデバッグしてバグを見つけるのに十分な情報が得られたことを願っています。

于 2012-10-04T16:05:55.777 に答える
0

ほとんどの場合、プログラマーのエラーである範囲外のインデックス例外が発生しています。ただし、投稿された正確なコードを取得したところ、例外なく正常に機能しました。あなたのエラーは ArrayListSort.java:98 のエラーを示しているので、投稿したクラスの 98 行目は 59 行しかありません。したがって、自分のクラスの間違ったバージョンを実行しているため、投稿したクラスを実行していることを確認してください。それが問題でした。

あなたの投稿されたコードを変更せずに実行した結果

結果 size1 結果 size2 結果 size3 結果 size4 結果 size5 結果 size6 結果 size7 結果 size8 partiainfosize1 r サイズ 7 partiainfosize1 r サイズ 6 partiainfosize1 r サイズ 5 partiainfosize1 r サイズ 4 partiainfosize1 r サイズ 3 partiainfosize1 r サイズ 2 partiainfosize1 r サイズ 1 partiainfosize1 r サイズ 0

于 2012-10-04T16:16:28.880 に答える
0
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

は、サイズ 6 の配列リストがあり、6 番目のインデックスの要素にアクセスしようとしていることを示しています。どちらが間違っていますか

arraylist インデックスのインデックスは 0 であることに注意してください。したがって、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
于 2012-10-04T16:09:10.637 に答える