0

1 つのリストで同じ緯度、経度を持つすべてのリストをフィルタリングし、同じリストに入れ、そのリストをマップに入れます。私のコードは次のとおりです:-

private Collection<List<Applicationdataset>> groupTheList(ArrayList<Applicationdataset> arrayList)
  {
    Map<Key, List<Applicationdataset>> map = new HashMap<Key, List<Applicationdataset>>();
    for(Applicationdataset appSet: arrayList)
       {
        Key key = new Key(appSet.getLatitude(), appSet.getLongitude());
        List<Applicationdataset> list = map.get(key);
        if(list == null){
            list = new ArrayList<Applicationdataset>();

        }
        list.add(appSet);
             map.put(key, list);
    }
    return map.values();
}


public class Key {
    String _lat;
    String _lon;

    Key(String lat, String lon) {
        _lat = lat;
        _lon = lon;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Key key = (Key) o;

        if (!_lat.equals(key._lat)) return false;
        if (!_lon.equals(key._lon)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = _lat.hashCode();
        result = 31 * result + _lon.hashCode();
        return result;
    }
}

しかし、Web サービスからの xml に従ってコードをデバッグしているときに、同じ緯度経度を持つ 2 つのリストがあり、デバッグ時に amp の同じリストに保存されますが、デバッグの次のステップに進むと、マップの要素をデバッグしますアイテム リストが 2 つ減少し、サイズが 1 と表示されているのですが、この問題を修正することはできません。

4

2 に答える 2

1

あなたのコードは問題ないように見えます:一貫してオーバーライドequals()しました。hashCode()

trim()おそらくコンストラクターで、問題の原因として緯度/経度値の空白を確認してください。

Key(String lat, String lon) {
    _lat = lat.trim();
    _lon = lon.trim();
}

また、コードを次のように単純化できます。

@Override
public boolean equals(Object o) {
    return o instanceof Key
        && _lat.equals(((Key)o)._lat))
        && _lon.equals(((Key)o)._lon));
}

@Override
public int hashCode() {
    // String.hashCode() is sufficiently good for this addition to be acceptable
    return _lat.hashCode() + _lon.hashCode();
}
于 2012-06-27T06:11:22.073 に答える
0

それはあなたが達成しようとしていることを理解するのは少し難しいです。しかし、問題は、Key hashCode()/ equals()実装で緯度と経度の両方を使用していることであると思います。そのため、入力リストの2番目のApplicationdatasetがマップオブジェクトの最初のApplicationdatasetに置き換わります。関連リストがすでにマップに配置されている場合は、ケースを実装する必要があり、置き換えないでください。

于 2012-06-27T05:39:21.857 に答える