Java 为什么要删除地图的元素?
我正在筛选具有相同lat的所有列表,长在一个列表中,并将其放入同一个列表中,然后将该列表放入地图。我的代码如下:-Java 为什么要删除地图的元素?,java,Java,我正在筛选具有相同lat的所有列表,长在一个列表中,并将其放入同一个列表中,然后将该列表放入地图。我的代码如下:- private Collection<List<Applicationdataset>> groupTheList(ArrayList<Applicationdataset> arrayList) { Map<Key, List<Applicationdataset>> map = new HashMap<
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;
}
}
私有集合组列表(ArrayList ArrayList)
{
Map Map=newhashmap();
对于(Applicationdataset appSet:arrayList)
{
Key Key=newkey(appSet.getLatitude(),appSet.getLongitude());
List=map.get(键);
if(list==null){
列表=新的ArrayList();
}
list.add(appSet);
地图。放置(键、列表);
}
返回map.values();
}
公开类密钥{
字符串_lat;
弦;
键(串横向,串纵向){
_lat=lat;
_lon=lon;
}
@凌驾
公共布尔等于(对象o){
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
键=(键)o;
如果(!\u lat.equals(key.\u lat))返回false;
如果(!\u lon.equals(key.\u lon))返回false;
返回true;
}
@凌驾
公共int hashCode(){
int result=_lat.hashCode();
result=31*result+_lon.hashCode();
返回结果;
}
}
但是,当我根据来自web服务的xml调试代码时,有两个列表具有相同的lat-long,并且在调试时它们保存在相同的amp列表中,但是当我进行下一步调试时,map元素的2项列表减小,显示大小为1,我无法纠正这个问题。这有点难以解决了解你想要实现的目标。但我认为问题在于,您在键hashCode()/equals()实现中同时使用了纬度和经度,这就是为什么输入列表中的第二个应用程序数据集将替换map对象中的第一个应用程序数据集。当相关列表已经放入map时,您应该实现该情况,而不要替换它。您的代码看起来正常:您已经一致地覆盖了
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();
}
也许对其他人来说,你的问题似乎更合理,但目前我不完全确定如何理解你的问题。请你先说明你想做什么好吗?这也可能有助于我们了解您遇到的问题。实际上,我的要求是,我希望存储所有具有相同lat的属性列表,长在xml的一个列表中,该xml来自web服务,我尝试了上面的代码。很抱歉我的解释。但在调试的第一步中,假设第一个属性lat,在列表中长时间出现2次,正确保存在列表中意味着在映射中显示列表(L1)的大小为2,但当我迭代下一步时,意味着循环将进一步运行,2-3倍于arralist(L1)的大小显示为1,这是我的问题。。