我有一个带有放置距离的列表视图,如下所示:
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;
}
}
答案 0 :(得分:2)
你正在排序字符串。 String的自然顺序是词典排序。你想要的是整数排序。因此,对int
使用String
而不是Place.placeDistance
。或者至少将字符串转换为与整数进行比较,并比较这些整数。
此外,调用您的字段placeDistance
会增加不必要的噪音。只需将其称为distance
(当然,对其他字段也一样)。
答案 1 :(得分:2)
首先,您提供的排序并不是您获得的实际排序。例如,第二个实际上是:
70
600
60
500
50
400
300
200
100
不应使用字符串进行比较 - 它按字典顺序进行比较,这意味着比较为described here。所以“abc”大于“ab”,“d”大于“ccc”。
您想要比较数字值,所以请这样做。一种选择是使用Integer.valueOf
来获取您使用的值的实际整数值。
顺便说一下,我认为placeDistance
String
字段无法获得收益。你为什么一直没有Integer
?
答案 2 :(得分:1)
问题是你在比较器中使用:
return rhs.getPlaceDistance().compareTo(lhs.getPlaceDistance());
和placeDistance是一个字符串,因此您要比较字符串,而不是数字值。
答案 3 :(得分:1)
我认为这是因为你在比较字符串。尝试将比较覆盖更改为:
@Override
public int compare(Place lhs, Place rhs)
{
return Integer.parseInt(rhs.getPlaceDistance()).compareTo(
Integer.parseInt(lhs.getPlaceDistance()));
};
我认为理想的解决方案可能是在您的位置保持整数而不是字符串。 请注意,如果您将有小数位,则应尝试使用Float或Double而不是Integer