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
嗨,我试着用你的代码,但仍然出现错误,我更新logcat输出。有任何想法吗? – Bambang
哦,我明白了,这个错误是因为我在距离上加了“km”。感谢队友,这是工作 – Bambang