1

我有一个包含位置距离的列表视图,如下所示:

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

}
4

4 回答 4

2

您正在对字符串进行排序。String 的自然顺序是字典顺序。你想要的是整数排序。所以使用 aint而不是Stringfor Place.placeDistance。或者至少将字符串转换为整数,然后比较这些整数。

此外,调用您的字段placeDistance会增加不必要的噪音。只需调用它distance(当然,对其他字段也一样)。

于 2013-01-06T14:28:37.543 回答
2

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

70
600
60
500
50
400
300
200
100

不应使用字符串进行比较 - 它按字典顺序进行比较,这意味着比较如此处所述。所以“abc”大于“ab”,“d”大于“ccc”。

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

顺便说一句,我认为你拥有placeDistance一个String领域没有任何好处。你为什么不一直拥有它Integer

于 2013-01-06T14:29:21.490 回答
1

问题是在你的比较器中你使用:

return rhs.getPlaceDistance().compareTo(lhs.getPlaceDistance());

并且 placeDistance 是一个字符串,因此您要比较的是字符串,而不是数值。

于 2013-01-06T14:28:55.577 回答
1

我认为这是因为您正在比较字符串。尝试将您的比较覆盖更改为:

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

我认为理想的解决方案可能是在您的位置保存整数而不是字符串。请注意,如果您有小数位,您应该尝试 Float 或 Double 而不是 Integer

于 2013-01-06T14:31:51.453 回答