我正在过滤所有相同lat的列表,在一个列表中长并放入相同的列表并将该列表放入映射我的代码如下: -
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;
}
}
但是当我根据来自网络服务的xml对我的代码进行调试时,有2个列表具有相同的lat长度,并且它们在调试时保存在放大器的相同列表中但是当我进入下一步调试时有2个项目列表减少并显示大小1的地图元素我无法纠正这个问题。
答案 0 :(得分:1)
您的代码看起来没问题:您已经一致地覆盖了equals()
和hashCode()
。
检查lat / lng值中的空格是导致问题的原因,可能是构造函数中的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();
}
答案 1 :(得分:0)
有点难以理解你想要完成的事情。但我相信问题是你在Key hashCode()/ equals()实现中使用纬度和经度,这就是为什么输入列表中的第二个Applicationdataset替换了map对象中的第一个。当相关列表已经放入地图并且不替换它时,您应该实现这种情况。