2013-10-08 112 views
1

我有海岸線座標(超過一百個座標),我想把座標放入數組中。 之後,計算我的當前位置與所有座標之間的距離(使用for循環),並將結果放入數組中。 所以我有兩個陣列如何使用ArrayList和For循環之後,將循環結果放入數組?

  1. 地理點陣列
  2. 距離陣列

我想找到的距離排列的最小值,但程序會強制關閉。這裏是我的代碼只顯示十個座標:

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/Process(632): Sending signal. PID: 632 SIG: 9 
10-08 13:20:31.743: D/dalvikvm(675): GC_FOR_ALLOC freed 254K, 10% free 5364K/5959K, paused 95ms, total 99ms 
10-08 13:20:31.993: I/Choreographer(675): Skipped 59 frames! The application may be doing too much work on its main thread. 
10-08 13:20:32.024: D/gralloc_goldfish(675): Emulator without GPU emulation detected. 
10-08 13:20:33.944: I/Choreographer(675): Skipped 159 frames! The application may be doing too much work on its main thread. 
10-08 13:20:34.084: D/AndroidRuntime(675): Shutting down VM 
10-08 13:20:34.084: W/dalvikvm(675): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
10-08 13:20:34.174: E/AndroidRuntime(675): FATAL EXCEPTION: main 
10-08 13:20:34.174: E/AndroidRuntime(675): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.marker/com.marker.Nav}: java.lang.RuntimeException: stub 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.os.Looper.loop(Looper.java:137) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-08 13:20:34.174: E/AndroidRuntime(675): at java.lang.reflect.Method.invokeNative(Native Method) 
10-08 13:20:34.174: E/AndroidRuntime(675): at java.lang.reflect.Method.invoke(Method.java:511) 
10-08 13:20:34.174: E/AndroidRuntime(675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-08 13:20:34.174: E/AndroidRuntime(675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-08 13:20:34.174: E/AndroidRuntime(675): at dalvik.system.NativeStart.main(Native Method) 
10-08 13:20:34.174: E/AndroidRuntime(675): Caused by: java.lang.RuntimeException: stub 
10-08 13:20:34.174: E/AndroidRuntime(675): at com.google.android.maps.GeoPoint.(Unknown Source) 
10-08 13:20:34.174: E/AndroidRuntime(675): at com.marker.Nav.onCreate(Nav.java:32) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.Activity.performCreate(Activity.java:5008) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
10-08 13:20:34.174: E/AndroidRuntime(675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
10-08 13:20:34.174: E/AndroidRuntime(675): ... 11 more 
+1

它會在哪一行崩潰? –

+1

強行關閉意味着最有可能發生異常。所以你也可以在這裏發佈你的例外。你可以從LogCat中獲得它。 – Husyn

+0

我已經顯示我的logcat @Husyn –

回答

2

沒有看到您的錯誤信息,我可以肯定地發現一個問題。您正在迭代列表的末尾。在循環條件下使用<而不是<=

此外,這可能不是一個錯誤,但你爲什麼要在循環內調用Collections.min()?在所有距離都被填充之後,你不想這樣做嗎?我誤解你要去的是什麼?

+0

其實我不知道我必須把Collections.min()。我打算做的是,如果所有的距離已經在Distance數組中,我想查找距離數組的Collections.min()。我已經顯示我的LogCat。嘿喲告訴我哪一個是錯的? @vidya –

1

這聽起來像你正在ArrayIndexOutOfBoundsExceptionDocs

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

所以通過改變它嘗試

for(int i=0; i<points.size(); i++){ 
+0

我試圖改變它,但它仍然不起作用..我想我得到chras in here「double distance = locationA.distanceTo(points(i));」你能看看我應該改變什麼嗎? @tarsem –

2

LocationManager locationManager =(LocationManager)getSystemService(LOCATION_SERVICE);

使用getApplicationContext()。getSystemService(LOCATION_SERVICE);

或Context.getSystemService(LOCATION_SERVICE);