多个哈希映射为一个。 Java的

时间:2014-11-12 08:18:47

标签: java android google-maps arraylist hashmap

我有以下代码可以使用,但如果有任何办法,我怎么能缩短它。我将深入解释。

我将这三个声明为全球:

private Map<Marker, String> pictureinfo = new HashMap<Marker, String>();
private Map<Marker, String> latitudeinfo = new HashMap<Marker, String>();
private Map<Marker, String> longitudeinfo = new HashMap<Marker, String>();

我有一个名为markers()的方法,它有一个非常大的代码,但在代码的某处,我有:

pictureinfo.put(marker, poza);
latitudeinfo.put(marker, latitude + "");
longitudeinfo.put(marker, longitude + "");

poza,纬度和经度来自数据库,但这是无关紧要的。在代码中,我有一个自定义的infowindow用于多个标记,我有:

String picture = pictureinfo.get(marker);
latcoord.setText(latitudeinfo.get(marker));
lngcoord.setText(longitudeinfo.get(marker));

如何缩短这些线?代码有效,但我确信还有另一种方式,更短,更优。我没有太多经验希望HashMaps和ArrayLists所以任何指导都将受到赞赏,我想学习,谢谢。

2 个答案:

答案 0 :(得分:3)

您可以创建一个包含info字段的包装器对象,然后将这些包装器存储在一个映射中。

但是,我不会因为这种优化而烦恼太多,可能没有多少收获。

我会做什么(虽然这只是一种方式):

class LocationInfo {
   private String latitudeInfo;
   private String longitudeInfo;     
   ...
}

class PictureInfo {      
  private String description; //I assume that's what pictureInfo means
  private LocationInfo locInfo;
  ...
}

Map<Marker, PictureInfo> infoMap = ...;

我不确定你的代码的确切语义,所以这只是粗略的近似。基本上我将一个位置的信息放在一个类中,因为它不一定是图片特定的。根据语义,LocationInfo也可以包含位置本身 - 在这种情况下,我将该类命名为Location。 (顺便说一句,你还要latitude + ""等等,所以我假设你原来有原始数字。如果是这样的话,那么我将它们存储在LocationInfo类中未转换)。

然后

PictureInfo包含一个描述,它自己的LocationInfo以及它需要的任何其他内容。然后,您只需在地图中存储PictureInfo个实例。 (如果Marker仅用于PictureInfo,则它也可以是该类的成员。)

正如您所看到的,代码可能不会缩短,但通常更短并不会更好,因为代码可能更难以理解和维护。通常,您需要在代码中使用更多结构,例如通过将相关数据封装到有意义的类等中。

答案 1 :(得分:1)

不确定您的目的,但从第一眼看这个代码会损害面向对象。您在地图中保存的数据似乎强烈地连接到某个Marker对象,并且应该在其中。

class Marker{
    ....

    String pictureInfo;
    String latitude;
    String longitude;

    ...
}

而不是:

pictureinfo.put(marker, poza);
latitudeinfo.put(marker, latitude + "");
longitudeinfo.put(marker, longitude + "");

这样:

marker.setPictureInfo(poza);
marker.setLatitudeInfo(String.valueof(latitude));
marker.setLongitudeInfo(String.valueof(longitude));


String picture = marker.getPictureInfo();
latcoord.setText(marker.getLatitudeInfo());
lngcoord.setText(marker.getLongitudeInfo());