2014-02-10 37 views
0

我有关于从列表视图中排序数据的问题。我在这里搜索并发现有关排序字符串数据。我需要从我的listView中对Double数据进行排序,我遇到了类似Android: How to sort data for ListView?的问题,并且我发现有人使用这种方法对字符串数据进行排序:How to Compare String of HashMap and arrange them?排序ListView上的双数据(距离)

我在这里的代码

JSONArray tambalban = null; 
ArrayList<HashMap<String, String>> listMotor = new ArrayList<HashMap<String,String>>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    new GetJSON().execute(); 
} 

public class GetJSON extends AsyncTask<String, Integer, ArrayList<HashMap<String, String>>>{ 

@Override 
protected ArrayList<HashMap<String, String>> doInBackground(String... params) { 
    // TODO Auto-generated method stub 
    JSONParser jParser = new JSONParser(); 
    JSONObject json = jParser.getJSONFromURL(url); 
    try { 
     tambalban = json.getJSONArray(TAG_MOTOR); 

     for (int i = 0; i < tambalban.length(); i++){ 
      JSONObject mtr = tambalban.getJSONObject(i); 

      String id_tb = mtr.getString(TAG_ID); 
      String name_tb = mtr.getString(TAG_NAME); 
      String address_tb = mtr.getString(TAG_ADDRESS); 
      String telp_tb = mtr.getString(TAG_TELP); 
      String lat = mtr.getString(TAG_LAT); 
      String lng = mtr.getString(TAG_LNG); 

      double lat_tujuan = Double.parseDouble(lat); 
      double lng_tujuan = Double.parseDouble(lng); 
      double lat_asal = -7.781083333; 
      double lng_asal = 110.4824833; 

      double distance = hitungJarak (lat_asal, lng_asal, lat_tujuan, lng_tujuan); 
      distance = RoundDecimal(distance, 2); 
      String jarak = Double.toString(distance)+ " km"; 

      HashMap<String, String> a = new HashMap<String, String>(); 
      a.put(TAG_ID, id_tb); 
      a.put(TAG_NAME, name_tb); 
      a.put(TAG_ADDRESS, address_tb); 
      a.put(TAG_TELP, telp_tb); 
      a.put(TAG_LAT, lat); 
      a.put(TAG_LNG, lng); 
      a.put(TAG_DISTANCE, distance); 

      listMotor.add(a); 

**Sorting Code**     
Collections.sort(listMotor, new Comparator<HashMap<String, String>>() { 
       @Override 
       public int compare(HashMap<String, String> o1, 
         HashMap<String, String> o2) { 

        return Double.compare(o1.get(Double.parseDouble(TAG_DISTANCE)), o1.get(Double.parseDouble(TAG_DISTANCE))); // error 
        // return Double.compare(o1.get(value1), o1.get(value2)); **--> PREM answer, how to use it?** 
       }     
      });       
     }   
    }catch (JSONException e){ 
     e.printStackTrace(); 
    }  
    return listMotor;  
} 


private double RoundDecimal(double distance, int i) { 
    BigDecimal bd = new BigDecimal(distance); 
    bd = bd.setScale(i, 6);   
    return bd.doubleValue(); 
} 


private double hitungJarak(double lat_asal, double lng_asal, 
     double lat_tujuan, double lng_tujuan) { 

    double dist; 
    double radius = 6371; 
    double dLat = Math.toRadians(lat_tujuan- lat_asal); 
    double dLon = Math.toRadians(lng_tujuan - lng_asal); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) 
      + Math.cos(Math.toRadians(lat_asal)) * Math.cos(Math.toRadians(lat_tujuan)) 
      * Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    double valueResult = radius * c; 
    double km = valueResult/1; 
    DecimalFormat newFormat = new DecimalFormat("####"); 
    int kmInDec = Integer.valueOf(newFormat.format(km)); 
    dist = radius * c; 
    return dist;   
} 

@Override 
protected void onPostExecute(ArrayList<HashMap<String, String>> listMotor) { 
    // TODO Auto-generated method stub 

    super.onPostExecute(listMotor); 
    ListAdapter adapter = new SimpleAdapter(getActivity(), listMotor, 
      R.layout.list_item, new String[] { TAG_NAMA, TAG_ALAMAT, TAG_JARAK }, 
      new int[] { R.id.namatb, R.id.alamattb, R.id.jarak }); 
    setListAdapter(adapter); 

}  
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.list_fragment, container, false); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
super.onListItemClick(l, v, position, id); 
    String pilih = getListAdapter().getItem(position).toString(); 
    Toast.makeText(getActivity(), 
      pilih, 
      Toast.LENGTH_LONG).show();   

    Intent i = new Intent(getActivity(), DetailDaftar.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("Selected", pilih); 

    i.putExtras(bundle); 
    startActivity(i); 
} 
} 

如何使回报Double.compare(o1.get(值),o1.get(值2));工作,任何方法比从String到Double和Double再解析距离更简单的字符串?

logcat的输出

02-10 10:58:39.251: E/AndroidRuntime(2578): FATAL EXCEPTION: AsyncTask #1 
02-10 10:58:39.251: E/AndroidRuntime(2578): Process: com.maps.paktebe, PID: 2578 
02-10 10:58:39.251: E/AndroidRuntime(2578): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-10 10:58:39.251: E/AndroidRuntime(2578):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.lang.Thread.run(Thread.java:841) 
02-10 10:58:39.251: E/AndroidRuntime(2578): Caused by: java.lang.NumberFormatException: Invalid double: "0.34 km" 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.lang.StringToReal.parseDouble(StringToReal.java:269) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.lang.Double.parseDouble(Double.java:295) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at com.maps.paktebe.Motor$AmbilDataJSON$1.compare(Motor.java:98) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at com.maps.paktebe.Motor$AmbilDataJSON$1.compare(Motor.java:1) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.TimSort.countRunAndMakeAscending(TimSort.java:320) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.TimSort.sort(TimSort.java:185) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.TimSort.sort(TimSort.java:169) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.Arrays.sort(Arrays.java:2023) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.Collections.sort(Collections.java:1883) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at com.maps.paktebe.Motor$AmbilDataJSON.doInBackground(Motor.java:92) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at com.maps.paktebe.Motor$AmbilDataJSON.doInBackground(Motor.java:1) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at android.os.AsyncTask$2.call(AsyncTask.java:288) 
02-10 10:58:39.251: E/AndroidRuntime(2578): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
02-10 10:58:39.251: E/AndroidRuntime(2578): ... 4 more 

回答

2

我想你只需要解析的,而不是分析输入你走出地图的价值。更新你的比较是这样的:

@Override 
public int compare(HashMap<String, String> o1, 
        HashMap<String, String> o2) { 
    return Double.compare(Double.parseDouble(o1.get(TAG_DISTANCE)), Double.parseDouble(o2.get(TAG_DISTANCE))); 
} 
+0

嗨,我试着用你的代码,但仍然出现错误,我更新logcat输出。有任何想法吗? – Bambang

+0

哦,我明白了,这个错误是因为我在距离上加了“km”。感谢队友,这是工作 – Bambang