android - string.compareTo(string) 在排序时没有产生正确的结果

标签 android android-listview android-arrayadapter compareto

我有一个带有位置距离的 ListView ,如下所示:

100
200
300
400
500
50
600
70
40

我需要按升序和降序对这个地方的距离进行排序。所以我所做的是,对适配器进行排序并使用 adapter.notifyDataSetChanged()。如果距离是 3 位数字,即 230、450、352、254 等,则一切正常。但如果位置距离是 2 位数字,如 52、65、75 等,我会得到错误的排序值,如下所示。

对于升序:排序后我得到这个顺序

100
200
300
400
500
600
50
60
70

对于降序:排序后我得到这个顺序

70
60
50
600
500
400
300
200
100

我的排序代码如下所示:

case R.id.action_sort_dist_fn:

            adapter.sort(new Comparator<Place>() {

                @Override
                public int compare(Place lhs, Place rhs) {
                    return rhs.getPlaceDistance().compareTo(
                            lhs.getPlaceDistance());
                };
            });

            adapter.notifyDataSetChanged();
            break;

        case R.id.action_sort_dist_nf:

            adapter.sort(new Comparator<Place>() {

                @Override
                public int compare(Place lhs, Place rhs) {
                    return lhs.getPlaceDistance().compareTo(
                            rhs.getPlaceDistance());
                };
            });

Place.java

public class Place {
    String placeName = "";
            String placeDistance="";
            String placeCategoryIcon;

    public Place(String placeName, String placeDistance,
            String placeCategoryIcon) {

        this.placeName = placeName;
        this.placeDistance = placeDistance;
        this.placeCategoryIcon = placeCategoryIcon;
    }

    public String getPlaceName() {
        return placeName;
    }

    public void setPlaceName(String placeName) {
        this.placeName = placeName;
    }

    public String getPlaceDistance() {
        return placeDistance;
    }

    public void setPlaceDistance(String placeDistance) {
        this.placeDistance = placeDistance;
    }

    public String getPlaceCategoryIcon() {
        return placeCategoryIcon;
    }

    public void setPlaceCategoryIcon(String placeCategoryIcon) {
        this.placeCategoryIcon = placeCategoryIcon;
    }

}

最佳答案

首先,您给出的排序并不是您得到的实际排序。例如第二个实际上是:

70
600
60
500
50
400
300
200
100

不应该使用字符串进行比较 - 它按字典顺序进行比较,这意味着比较为 described here .所以“abc”大于“ab”,“d”大于“ccc”。

您想比较数值,请这样做。一种选择是使用 Integer.valueOf 获取与您使用的值等效的实际整数值。

顺便说一句,我看不出您拥有 placeDistance 一个 String 字段。你为什么不一直把它作为 Integer

关于android - string.compareTo(string) 在排序时没有产生正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14182979/

相关文章:

android - 如何使用凭据解决 gradle 传递依赖?

android - 删除项目后 ListView 不更新

android - Instanceof 不返回正确答案

Android改造解析List中嵌套的json响应

java - android ArrayAdapter.clear() 清除自定义方法变量

android - 自定义 ListView 不显示

android - 如何在单击 ListView 项时播放声音?

android - onChildDraw 使项目闪烁

android - 在 Android 中滚动屏幕时, ListView 中的切换按钮会失去状态

android - 将 ListView 行的颜色填充到一定百分比