在ListView的排序双数据(距离) [英] Sorting Double Data (distance) on ListView

查看:127
本文介绍了在ListView的排序双数据(距离)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经约从列表视图中对数据进行排序的问题。我这里搜索,发现有关排序字符串数据。我需要双数据从我的ListView排序,我有这样的的Andr​​oid同样的问题:如何对数据进行排序的ListView ,我发现使用这种方法进行排序字符串数据的人:<?一href=\"http://stackoverflow.com/questions/9834849/how-to-compare-string-of-hashmap-and-arrange-them\">How比较HashMap中的字符串,并安排他们呢?。

我的code这里

  JSONArray tambalban = NULL;
ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT; listMotor =新的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;();@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    新的getJSON()执行();
} 公共类的getJSON扩展的AsyncTask&LT;字符串,整数的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;&GT; {@覆盖
保护的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT; doInBackground(字符串... PARAMS){
    // TODO自动生成方法存根
    JSONParser jParser =新JSONParser();
    JSONObject的JSON = jParser.getJSONFromURL(URL);
    尝试{
        tambalban = json.getJSONArray(TAG_MOTOR);        的for(int i = 0; I&LT; tambalban.length();我++){
            的JSONObject MTR = tambalban.getJSONObject(ⅰ);            字符串id_tb = mtr.getString(TAG_ID);
            字符串name_tb = mtr.getString(TAG_NAME);
            字符串address_tb = mtr.getString(TAG_ADDRESS);
            字符串telp_tb = mtr.getString(TAG_TELP);
            字符串经纬度= mtr.getString(TAG_LAT);
            字符串LNG = mtr.getString(TAG_LNG);            双lat_tujuan = Double.parseDouble(LAT);
            双lng_tujuan = Double.parseDouble(LNG);
            双lat_asal = -7.781083333;
            双lng_asal = 110.4824833;            双距离= hitungJarak(lat_asal,lng_asal,lat_tujuan,lng_tujuan);
            距离= RoundDecimal(距离,2);
            字符串jarak = Double.toString(距离)​​+公里;            HashMap的&LT;字符串,字符串&GT;一个=新的HashMap&LT;字符串,字符串&GT;();
            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,距离);            listMotor.add(一);**排序code **
Collections.sort(listMotor,新的比较&LT;&HashMap的LT;字符串,字符串&GT;&GT;(){
                @覆盖
                公众诠释比较(HashMap的&LT;字符串,字符串&GT; 01,
                        HashMap的&LT;字符串,字符串&GT; O2){                    返回Double.compare(o1.get(Double.parseDouble(TAG_DISTANCE)),o1.get(Double.parseDouble(TAG_DISTANCE))); //错误
                    //返回Double.compare(o1.get(值),o1.get(值2)); ** - &GT; $ P $点的答案,如何使用它?**
                }
            });
        }
    }赶上(JSONException E){
        e.printStackTrace();
    }
    返回listMotor;
}
私人双RoundDecimal(双距离,int i)以{
    BigDecimal的BD =新的BigDecimal(距离);
    BD = bd.setScale(I,6);
    返回bd.doubleValue();
}
私人双hitungJarak(双lat_asal,双lng_asal,
        双lat_tujuan,双lng_tujuan){    双DIST;
    双半径= 6371;
    双DLAT = Math.toRadians(lat_tujuan- lat_asal);
    双dLon = Math.toRadians(lng_tujuan - lng_asal);
    双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);
    双C = 2 * Math.asin(的Math.sqrt(一));
    双valueResult =半径* C;
    双公里= valueResult / 1;
    DecimalFormat的newFormat =新的DecimalFormat(####);
    INT kmInDec = Integer.valueOf(newFormat.format(公里));
    DIST =半径* C;
    返回DIST;
}@覆盖
保护无效onPostExecute(ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT; listMotor){
    // TODO自动生成方法存根    super.onPostExecute(listMotor);
    ListAdapter适配器=新SimpleAdapter(getActivity(),listMotor,
            R.layout.list_item,新的String [] {TAG_NAMA,TAG_ALAMAT,TAG_JARAK},
            新的INT [] {R.id.namatb,R.id.alamattb,R.id.jarak});
    setListAdapter(适配器);}
 } @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
        捆绑savedInstanceState){
    // TODO自动生成方法存根
    返回inflater.inflate(R.layout.list_fragment,集装箱,FALSE);
} @覆盖
公共无效onListItemClick(ListView中升,视图V,INT位置,长的id){
 super.onListItemClick(L,V,位置ID);
    字符串pilih = getListAdapter()的getItem(位置)的ToString()。
    Toast.makeText(getActivity(),
            pilih,
            Toast.LENGTH_LONG).show();    意图I =新意图(getActivity(),DetailDaftar.class);
    束束=新包();
    bundle.putString(选择,pilih);    i.putExtras(包);
    startActivity(ⅰ);
}
}

如何让返回Double.compare(o1.get(值),o1.get(值2)); 的工作,更简单,不是从字符串解析距离翻一番,双给任何方法再次字符串?

logcat的输出

  10月2日至10日:58:39.251:E / AndroidRuntime(2578):致命异常:AsyncTask的#1
10月2日至10日:58:39.251:E / AndroidRuntime(2578):工艺:com.maps.paktebe,PID:2578
10月2日至10日:58:39.251:E / AndroidRuntime(2578):了java.lang.RuntimeException:执行doInBackground发生错误()
10月2日至10日:58:39.251:E / AndroidRuntime(2578):在android.os.AsyncTask $ 3.done(AsyncTask.java:300)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.FutureTask.setException(FutureTask.java:222)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.FutureTask.run(FutureTask.java:242)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:587)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.lang.Thread.run(Thread.java:841)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):java.lang.NumberFormatException:通过而产生的无效双:0.34公里
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.lang.StringToReal.invalidReal(StringToReal.java:63)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.lang.StringToReal.parseDouble(StringToReal.java:269)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.lang.Double.parseDouble(Double.java:295)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在com.maps.paktebe.Motor $ AmbilDataJSON $ 1.compare(Motor.java:98)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在com.maps.paktebe.Motor $ AmbilDataJSON $ 1.compare(Motor.java:1)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.TimSort.countRunAndMakeAscending(TimSort.java:320)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.TimSort.sort(TimSort.java:185)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.TimSort.sort(TimSort.java:169)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.Arrays.sort(Arrays.java:2023)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.Collections.sort(Collections.java:1883)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在com.maps.paktebe.Motor $ AmbilDataJSON.doInBackground(Motor.java:92)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在com.maps.paktebe.Motor $ AmbilDataJSON.doInBackground(Motor.java:1)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在android.os.AsyncTask $ 2.call(AsyncTask.java:288)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):在java.util.concurrent.FutureTask.run(FutureTask.java:237)
 10月2日至10日:58:39.251:E / AndroidRuntime(2578):... 4个


解决方案

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

  @覆盖
公众诠释比较(HashMap的&LT;字符串,字符串&GT; 01,
                    HashMap的&LT;字符串,字符串&GT; O2){
    返回Double.compare(Double.parseDouble(o1.get(TAG_DISTANCE)),Double.parseDouble(o2.get(TAG_DISTANCE)));
}

I've problem about sorting data from listview. I search in here and found about sorting String data. I need to sort Double data from my listView, I've same problem like this Android: How to sort data for ListView?, and I found someone using this method for sorting String data : How to Compare String of HashMap and arrange them?.

My Code here:

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);
}
}

How to make return Double.compare(o1.get(value1), o1.get(value2)); work, Any method that more simpler than parse distance from String to Double and Double to String again?

Logcat Output

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

解决方案

I think you just need to parse the value you get out of the map, instead of parsing the input. Update your compare like this:

@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)));
} 

这篇关于在ListView的排序双数据(距离)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆