1

以下に示すように、場所の距離を含むリスト ビューがあります。

100
200
300
400
500
50
600
70
40

この場所の距離を昇順と降順の両方で並べ替える必要があります。それで、私がしたことは、アダプターをソートして、adapter.notifyDataSetChanged() を使用することでした。距離が 3 桁の数字、つまり 230、450、352、254 などであれば、すべて正常に機能します。しかし、場所の距離が 52、65、75 などの 2 桁の場合、以下に示すように間違ったソート値が得られます。

昇順の場合: ソート後、この順序を取得しています

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 の自然な順序付けは、辞書順です。あなたが望むのは整数の順序付けです。したがって、 forintではなく を使用してください。または、少なくとも文字列を変換して整数と比較し、それらの整数を比較します。StringPlace.placeDistance

また、フィールドを呼び出すと、placeDistance不要なノイズが追加されます。それを呼び出すだけdistanceです (もちろん、他のフィールドについても同じことを行います)。

于 2013-01-06T14:28:37.543 に答える
2

まず、あなたが与えるソートは、あなたが得ている実際のものではありません。たとえば、2番目のものは実際には次のとおりです。

70
600
60
500
50
400
300
200
100

文字列を使用して比較を行うべきではありません。辞書式に比較します。つまり、比較はhere で説明されているとおりです。したがって、「abc」は「ab」よりも大きく、「d」は「ccc」よりも大きくなります。

数値を比較したいので、そうしてください。1 つのオプションは、使用Integer.valueOfする値に相当する実際の整数値を取得するために使用することです。

ところで、あなたが畑を持っても何の得もないと思いplaceDistanceますString。なぜあなたはIntegerずっとそれを持っていないのですか?

于 2013-01-06T14:29:21.490 に答える
1

文字列を比較しているからだと思います。比較オーバーライドを次のように変更してみてください。

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

理想的な解決策は、文字列ではなく整数を保持することかもしれないと思います。小数点以下の桁数がある場合は、整数ではなく浮動小数点数または倍精度浮動小数点数を試してください。

于 2013-01-06T14:31:51.453 に答える
1

問題は、コンパレータで次を使用することです。

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

placeDistance は文字列であるため、数値ではなく文字列を比較しています。

于 2013-01-06T14:28:55.577 に答える