【问题标题】:Iterate through all objects or create map. What is better solution [closed]遍历所有对象或创建地图。什么是更好的解决方案[关闭]
【发布时间】:2017-01-03 23:25:33
【问题描述】:

我有枚举:

public enum Colour {
   RED, BLUE, BLACK;
}

我有汽车课:

public class Car {
   private int id;
   private Colour colour;
   //other fields, getters and setters
}

我在Map<Integer, Car> MAP_OF_CARS 有很多汽车。例如,我必须显示所有红色的汽车。所以这是我的问题,什么是更好的解决方案。遍历地图中的所有汽车或创建地图,其中汽车列表将由颜色定义?

第一个解决方案:

public List<Car> getCarsByColor(Colour colour) {
   List<Car> sameColour = new ArrayList<>();
   for (Car car : MAP_OF_CARS.values()) {
      if(car.getColour().equals(colour) {
         sameColour.add(car);
      }
   }
   return sameColour;
}

第二个解决方案:在创建新汽车对象的过程中,我会将它添加到地图中,结果我将拥有:

Map<Colour, List<Car>> CARS_BY_COLOURS;
CARS_BY_COLOURS.put(Colour.RED, car1);

我会这样做,而不是 for 循环:

public List<Car> getCarsByColor(Colour colour) {
   return CARS_BY_COLOURS.get(colour);
}

哪种解决方案似乎更专业?

【问题讨论】:

  • 通常地图是更直接的解决方案,但这取决于键的数量以及您的性能和内存限制。没有一个正确的答案。

标签: java for-loop hashmap


【解决方案1】:

这里没有“对”或“错”之分,关键在于哪个更适合您的应用。

第一个解决方案总是通过所有汽车。假设您的汽车按颜色或多或少均匀分布,这意味着迭代的汽车数量是三倍以上。

另一方面,第二种解决方案使您可以轻松访问所请求颜色的汽车,但在保存第二张地图时会产生一些内存开销。

这一切都归结为应用程序的要求。如果按颜色获取所有汽车是一种罕见的操作,或者如果内存要求是一个问题,那么第一个解决方案可能是首选。 如果获取某种颜色的所有汽车是应用程序中的常见操作,那么第二种选择可能会更好。

【讨论】:

    【解决方案2】:

    什么是更好的解决方案。遍历地图中的所有汽车或创建地图,其中汽车列表将由颜色定义?

    这取决于您搜索的频率和更新频率。

    一般来说,如果您只需要两件事(本例中为 id 和 color),则并行地图是最直接的解决方案。

    如果您查看的地图不止一对,则需要更好地考虑频率,不断更新您很少使用的地图并不理想。

    根据您拥有的对象和属性的数量,您可能还需要考虑使用外部数据存储方法,例如 SQL 服务器(MySQL、MSSQL 或其他),它将为您进行大量此类优化。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2011-10-09
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多