1

海岸線の座標 (100 を超える座標) があり、その座標を配列に入れたいと考えています。その後、現在の位置からすべての座標までの距離を計算し (for ループを使用)、結果を配列にも入れます。だから私は2つの配列を持っています

  1. ジオ ポイント配列
  2. 距離配列

Distance 配列の最小値を見つけたいのですが、プログラムは常に強制終了します。これが私のコードで、10個の座標を表示するだけです:

public class Nav extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nav);

        List<GeoPoint> points = new ArrayList<GeoPoint>();

        Double latitude1 = Double.parseDouble("-0.696928");
        Double longitude1 = Double.parseDouble("119.843473");       
        GeoPoint latLong1 = new GeoPoint((int)(latitude1*1e6),(int)(longitude1*1e6));

        Double latitude2 = Double.parseDouble("-0.699331");
        Double longitude2 = Double.parseDouble("119.84416");       
        GeoPoint latLong2 = new GeoPoint((int)(latitude2*1e6),(int)(longitude2*1e6));

        Double latitude3 = Double.parseDouble("-0.701048");
        Double longitude3 = Double.parseDouble("119.843817");       
        GeoPoint latLong3 = new GeoPoint((int)(latitude3*1e6),(int)(longitude3*1e6));

        Double latitude4 = Double.parseDouble("-0.702592");
        Double longitude4 = Double.parseDouble("119.843817");       
        GeoPoint latLong4 = new GeoPoint((int)(latitude4*1e6),(int)(longitude4*1e6));

        Double latitude5 = Double.parseDouble("-0.701563");
        Double longitude5 = Double.parseDouble("119.84622");       
        GeoPoint latLong5 = new GeoPoint((int)(latitude5*1e6),(int)(longitude5*1e6));

        Double latitude6 = Double.parseDouble("-0.702249");
        Double longitude6 = Double.parseDouble("119.84725");       
        GeoPoint latLong6 = new GeoPoint((int)(latitude6*1e6),(int)(longitude6*1e6));

        Double latitude7 = Double.parseDouble("-0.703451");
        Double longitude7= Double.parseDouble("119.846907");       
        GeoPoint latLong7 = new GeoPoint((int)(latitude7*1e6),(int)(longitude7*1e6));

        Double latitude8 = Double.parseDouble("-0.705167");
        Double longitude8 = Double.parseDouble("119.847937");       
        GeoPoint latLong8 = new GeoPoint((int)(latitude8*1e6),(int)(longitude8*1e6));

        Double latitude9 = Double.parseDouble("-0.70654");
        Double longitude9 = Double.parseDouble("119.849653");       
        GeoPoint latLong9 = new GeoPoint((int)(latitude9*1e6),(int)(longitude9*1e6));

        Double latitude10 = Double.parseDouble("10. -0.707914");
        Double longitude10 = Double.parseDouble("119.85137");       
        GeoPoint latLong10 = new GeoPoint((int)(latitude10*1e6),(int)(longitude10*1e6));



        points.add(latLong1);
        points.add(latLong2);
        points.add(latLong3);
        points.add(latLong4);
        points.add(latLong5);
        points.add(latLong6);
        points.add(latLong7);
        points.add(latLong8);
        points.add(latLong9);
        points.add(latLong10);


        // Get the location manager
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, true));
        Double lat,lon;

        lat = location.getLatitude ();
        lon = location.getLongitude ();

        Location locationA = new Location("USER");  
        locationA.setLatitude(lat);  
        locationA.setLongitude(lon);

        ArrayList<Double> dist = new ArrayList<Double>();
        for(int i=0; i<=points.size(); i++){
            double distances = locationA.distanceTo(points(i));

            dist.add(distances);
            double minDist = Collections.min(dist);
            Toast.makeText( getApplicationContext(),
                    "Your Distance to the beach is " + minDist,
                    Toast.LENGTH_LONG).show();

        }       
    }

    private Location points(int i) {
        // TODO Auto-generated method stub
        return null;
    }   
}

誰かが私のコードで何が間違っているのか知っていますか? そして、どの Goepoint が私の場所に近いかを知り、表示する方法は? これが私のLogCatです

 
10-08 13:20:18.784: I/プロセス (632): 信号を送信しています。PID: 632 SIG: 9
10-08 13:20:31.743: D/dalvikvm(675): GC_FOR_ALLOC は 254K を解放し、5364K/5959K を 10% 解放し、95ms を一時停止し、合計 99ms
10-08 13:20:31.993: I/Choreographer(675): 59 フレームスキップしました! アプリケーションがメイン スレッドで処理しすぎている可能性があります。
10-08 13:20:32.024: D/gralloc_goldfish(675): GPU エミュレーションなしのエミュレーターが検出されました。
10-08 13:20:33.944: I/Choreographer(675): 159 フレームスキップしました! アプリケーションがメイン スレッドで処理しすぎている可能性があります。
10-08 13:20:34.084: D/AndroidRuntime(675): VM をシャットダウンしています
10-08 13:20:34.084: W/dalvikvm(675): threadid=1: キャッチされない例外で終了するスレッド (グループ = 0x40a13300)
10-08 13:20:34.174: E/AndroidRuntime(675): 致命的な例外: メイン
10-08 13:20:34.174: E/AndroidRuntime(675): java.lang.RuntimeException: アクティビティ ComponentInfo{com.marker/com.marker.Nav} を開始できません: java.lang.RuntimeException: スタブ
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2059) で
10-08 13:20:34.174: E/AndroidRuntime (675): android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2084) で
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.ActivityThread.access$600(ActivityThread.java:130)
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) で
10-08 13:20:34.174: E/AndroidRuntime(675): android.os.Handler.dispatchMessage(Handler.java:99) で
10-08 13:20:34.174: E/AndroidRuntime(675): android.os.Looper.loop(Looper.java:137)
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.ActivityThread.main (ActivityThread.java:4745) で
10-08 13:20:34.174: E/AndroidRuntime(675): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で
10-08 13:20:34.174: E/AndroidRuntime(675): java.lang.reflect.Method.invoke(Method.java:511) で
10-08 13:20:34.174: E/AndroidRuntime(675): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) で
10-08 13:20:34.174: E/AndroidRuntime (675): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) で
10-08 13:20:34.174: E/AndroidRuntime(675): dalvik.system.NativeStart.main(ネイティブ メソッド) で
10-08 13:20:34.174: E/AndroidRuntime(675): 原因: java.lang.RuntimeException: スタブ
10-08 13:20:34.174: E/AndroidRuntime(675): com.google.android.maps.GeoPoint.(不明なソース)
10-08 13:20:34.174: E/AndroidRuntime (675): com.marker.Nav.onCreate (Nav.java:32) で
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.Activity.performCreate (Activity.java:5008) で
10-08 13:20:34.174: E/AndroidRuntime (675): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1079) で
10-08 13:20:34.174: E/AndroidRuntime(675): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2023) で
10-08 13:20:34.174: E/AndroidRuntime(675): ... 11 もっと見る
4

3 に答える 3

2

エラー メッセージが表示されなくても、間違いなく問題を特定できます。リストの最後を超えて反復しています。ループ条件<の代わりに使用します。<=

また、これはエラーではないかもしれませんが、なぜCollections.min()ループ内で呼び出しているのですか? すべての距離が入力された後、それを実行したいと思いませんか? 私はあなたが何をしようとしているのか誤解していますか?

于 2013-10-08T05:18:41.760 に答える
1

ドキュメントを取得しているようですArrayIndexOutOfBoundsException

for(int i=0; i<=points.size(); i++){ // Check i<= here it should be < only

に変更してみてください

for(int i=0; i<points.size(); i++){
于 2013-10-08T04:57:06.900 に答える