遍历所有对象或创建地图。什么是更好的解决方案

时间:2017-01-03 23:25:33

标签: java for-loop hashmap

我有枚举:

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);
}

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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

答案 1 :(得分:3)

没有&#34;对&#34;或&#34;错误&#34;在这里,问题是什么更适合您的申请。

第一个解决方案总是贯穿所有车辆。假设您按颜色分配了或多或少的均匀汽车,这意味着迭代次数超过汽车的三倍。

另一方面,第二种解决方案可以让您轻松访问所需颜色的汽车,但是在保留第二张地图时会有一些内存开销。

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