【问题标题】:ArrayList: java.lang.IndexOutOfBoundsException: Index: 283, Size: 283 [duplicate]ArrayList:java.lang.IndexOutOfBoundsException:索引:283,大小:283 [重复]
【发布时间】:2017-05-17 04:13:01
【问题描述】:

我编写了一个算法来计算一辆车跟随的轨道距离。轨道上的每个点都有一个(纬度,经度)。这是我的代码,我收到了上面提到的错误。

List<TrackPoint> tp = new ArrayList<TrackPoint>();    

for (int i = 0; i < tp.size(); i++) {
    double lat1 = tp.get(i).getLat();                        
    double lat2 = tp.get(i + 1).getLat();
    double lon1 = tp.get(i).getLon();                       
    double lon2 = tp.get(i + 1).getLon();
    double radlat1 = Math.PI * lat1 / 180;
    double radlat2 = Math.PI * lat2 / 180;
    double theta = lon1 - lon2;
    double radtheta = Math.PI * theta / 180;
    double dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    dist = Math.acos(dist);
    dist = dist * 180 / Math.PI;
    dist = dist * 60 * 1.1515; 
    dist = dist * 1609.344;// distance in miles
    double _KM = 1000; //KM the unit of distance                       
    //distance in km
    double distInKM = dist / _KM;
    DecimalFormat df = new DecimalFormat("###.###");
    double dt = Double.parseDouble(df.format(distInKM));
    double mileage = 0;
    mileage += mileage + dt;       
    tp.get(i).setMileage(mileage);                       
}

错误

java.lang.IndexOutOfBoundsException: Index: 283, Size: 283
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)

此错误指向行:double lat2 = tp.get(i + 1).getLat(); 我认为错误与列表大小有关,但我不知道为什么?有人帮我看看我有什么问题。

【问题讨论】:

    标签: java algorithm list arraylist


    【解决方案1】:

    当您转到循环中的最后一个对象 (TrackPoint) 时,i + 1 元素不存在。

    double lat2 = tp.get(i + 1).getLat();
    

    【讨论】:

      【解决方案2】:

      问题来了

      tp.get(i + 1)
      

      i 等于tp.size-1 时,你使它等于tp.size()。为了解决它,将 for 循环更改为:

      for (int i = 0; i < tp.size() - 1; i++) {
      

      【讨论】:

        【解决方案3】:

        当您转到循环中的最后一个对象 (TrackPoint) 时,第 (i + 1) 个元素不存在。希望下面的代码没问题。

        List<TrackPoint> tp = new ArrayList<TrackPoint>();    
        
        for (int i = 0; i < tp.size()-1; i++) {
            double lat1 = tp.get(i).getLat();                        
            double lat2 = tp.get(i + 1).getLat();
            double lon1 = tp.get(i).getLon();                       
            double lon2 = tp.get(i + 1).getLon();
            double radlat1 = Math.PI * lat1 / 180;
            double radlat2 = Math.PI * lat2 / 180;
            double theta = lon1 - lon2;
            double radtheta = Math.PI * theta / 180;
            double dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
            dist = Math.acos(dist);
            dist = dist * 180 / Math.PI;
            dist = dist * 60 * 1.1515; 
            dist = dist * 1609.344;// distance in miles
            double _KM = 1000; //KM the unit of distance                       
            //distance in km
            double distInKM = dist / _KM;
            DecimalFormat df = new DecimalFormat("###.###");
            double dt = Double.parseDouble(df.format(distInKM));
            double mileage = 0;
            mileage += mileage + dt;       
            tp.get(i).setMileage(mileage);                       
        }
        

        【讨论】:

          【解决方案4】:

          您循环迭代直到列表大小。但在最后一次迭代中,您试图获取 (i + 1) 索引在您的情况下不存在。

          double lat2 = tp.get(i + 1).getLat();
          

          更正这个 .get(i + 1)。

          【讨论】:

            【解决方案5】:

            以上所有答案都是正确的。或者可以尝试使用以下代码

            List<TrackPoint> tp = new ArrayList<TrackPoint>();
                for (int i = 0; i < tp.size(); i++) {
                double lat1 = tp.get(i - 1).getLat();                        
                double lat2 = tp.get(i).getLat();
                double lon1 = tp.get(i - 1).getLon();                       
                double lon2 = tp.get(i).getLon();
                double radlat1 = Math.PI * lat1 / 180;
                double radlat2 = Math.PI * lat2 / 180;
                double theta = lon1 - lon2;
                double radtheta = Math.PI * theta / 180;
                double dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
                dist = Math.acos(dist);
                dist = dist * 180 / Math.PI;
                dist = dist * 60 * 1.1515; 
                dist = dist * 1609.344;// distance in miles
                double _KM = 1000; //KM the unit of distance                       
                //distance in km
                double distInKM = dist / _KM;
                DecimalFormat df = new DecimalFormat("###.###");
                double dt = Double.parseDouble(df.format(distInKM));
                double mileage = 0;
                mileage += mileage + dt;       
                tp.get(i - 1).setMileage(mileage);
            }
            

            【讨论】:

            • 这行不通!我得到 java.lang.ArrayIndexOutOfBoundsException: -1
            猜你喜欢
            • 2020-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-02
            • 2015-12-17
            • 2015-05-16
            • 2015-07-10
            • 1970-01-01
            相关资源
            最近更新 更多