Java 使用嵌套映射对数据进行排序和分组是否效率低下?

Java 使用嵌套映射对数据进行排序和分组是否效率低下?,java,performance,sorting,map,Java,Performance,Sorting,Map,我有一堆我想要分组(按类别)和排序(按标签)的对象。这样做会不会是个坏主意 Map<String,Map<String,MyObject>> objMap = new HashMap(); for (MyObject o : getMyObjects()) { if (!objMap.containsKey(o.getCategory())) { objMap.put(o.getCategory(), new TreeMap()); }

我有一堆我想要分组(按类别)和排序(按标签)的对象。这样做会不会是个坏主意

Map<String,Map<String,MyObject>> objMap = new HashMap();
for (MyObject o : getMyObjects()) {
    if (!objMap.containsKey(o.getCategory())) {
        objMap.put(o.getCategory(), new TreeMap());
    }
    objMap.get(o.getCategory()).put(o.getLabel(), o);
}
Map objMap=newhashmap();
对于(MyObject o:getMyObjects()){
如果(!objMap.containsKey(o.getCategory())){
put(o.getCategory(),new TreeMap());
}
get(o.getCategory()).put(o.getLabel(),o);
}
我喜欢这个,因为它很简单,但是有更好的方法吗


编辑:将HashMap更改为TreeMap。

因为您提到希望对象按标签排序

Map<String,Map<String,MyObject>> objMap = new HashMap();
for (MyObject o : getMyObjects()) {
    if (!objMap.containsKey(o.getCategory())) {
        objMap.put(o.getCategory(), new TreeMap());
    }
    objMap.get(o.getCategory()).put(o.getLabel(), o);
}
Map objMap=newhashmap();
对于(MyObject o:getMyObjects()){
如果(!objMap.containsKey(o.getCategory())){
put(o.getCategory(),new TreeMap());
}
get(o.getCategory()).put(o.getLabel(),o);
}

既然您提到了,您希望对象按标签排序

Map<String,Map<String,MyObject>> objMap = new HashMap();
for (MyObject o : getMyObjects()) {
    if (!objMap.containsKey(o.getCategory())) {
        objMap.put(o.getCategory(), new TreeMap());
    }
    objMap.get(o.getCategory()).put(o.getLabel(), o);
}
Map objMap=newhashmap();
对于(MyObject o:getMyObjects()){
如果(!objMap.containsKey(o.getCategory())){
put(o.getCategory(),new TreeMap());
}
get(o.getCategory()).put(o.getLabel(),o);
}

虽然它不能直接用代码回答您的问题,但我认为您应该简要了解一下何时应该使用
Map
VS
List
——这种地址有多种

选项A:使用
List
您可以完全控制您的元素,这对您的情况会更好,您所要做的(如果您必须这样做的话)就是为
MyObject
中的特定字段实现您自己的分组方法

选项B:将使用
HashMap
,因为它有自己的排序方法来对对象标签进行排序

有很多选择,但是我想澄清的是,
贴图本质上是未排序的,然后还有一些变化,例如

底线是,这是一个相对宽泛的问题,你有多种方法可以做到这一点,用你认为最好的方法进行实验,请注意,如果你想使用选项B,那么你必须手动排序你的对象


希望能以某种方式提供帮助

虽然它不能用代码直接回答您的问题,但我认为您应该简要了解一下何时应该使用
Map
VS
List
——这类地址有多种

选项A:使用
List
您可以完全控制您的元素,这对您的情况会更好,您所要做的(如果您必须这样做的话)就是为
MyObject
中的特定字段实现您自己的分组方法

选项B:将使用
HashMap
,因为它有自己的排序方法来对对象标签进行排序

有很多选择,但是我想澄清的是,
贴图本质上是未排序的,然后还有一些变化,例如

底线是,这是一个相对宽泛的问题,你有多种方法可以做到这一点,用你认为最好的方法进行实验,请注意,如果你想使用选项B,那么你必须手动排序你的对象


希望在某种程度上有所帮助

内部地图似乎毫无用处,它应该是一个简单的列表:

Map<String, List<MyObject>> categoryMap = new HashMap<>();
for (MyObject o : objects) {
    String category = o.getCategory();
    List<MyObject> list = categoryMap.get(category);
    if (list == null) {
         list = new ArrayList<>();
         catgeoryMap.put(category, list);
    }
    list.add(o);
}
Map categoryMap=newhashmap();
对于(MyObject o:对象){
字符串category=o.getCategory();
List List=categoryMap.get(category);
if(list==null){
列表=新的ArrayList();
catgeoryMap.put(类别、列表);
}
列表。添加(o);
}
请注意,我清理了您的主循环,以便不再查找类别两次。
要对类别列表进行实际排序,请使用在标签上运行的比较器。

内部映射似乎完全无用,它应该是一个简单的列表:

Map<String, List<MyObject>> categoryMap = new HashMap<>();
for (MyObject o : objects) {
    String category = o.getCategory();
    List<MyObject> list = categoryMap.get(category);
    if (list == null) {
         list = new ArrayList<>();
         catgeoryMap.put(category, list);
    }
    list.add(o);
}
Map categoryMap=newhashmap();
对于(MyObject o:对象){
字符串category=o.getCategory();
List List=categoryMap.get(category);
if(list==null){
列表=新的ArrayList();
catgeoryMap.put(类别、列表);
}
列表。添加(o);
}
请注意,我清理了您的主循环,以便不再查找类别两次。 要对类别列表进行实际排序,请使用标签上的比较器。

您的问题是“有更好的方法吗?”当然,唯一的答案是:这取决于。你想改进什么

如果您试图提高检索特定MyObject所需的时间,那么使用贴图是一个不错的方法

如果您试图提高内存使用率,那么有几种技术可以使用。您可以坚持使用地图,使用字符串插入以及设置地图的大小,但这只有在您提前知道某些事情的情况下才会起作用。您可以放弃映射而使用数组,但这样会牺牲查找时间的便利性

您也可以使用内存中的Derby数据库之类的东西,但对于小任务来说,这可能有些过分

您是否确实遇到了此代码的问题?如果不是,那么你可能也不应该太担心它

另一件需要记住的事情是易于维护。如果您切换到多维数组,可能会节省大量内存,但您的代码将更难理解、维护和以后改进

最后,这始终是一系列的权衡,因此您是否能够“改进”此代码完全取决于您想要改进的内容。

您的问题是“有更好的方法吗?”当然,唯一的答案是:这取决于。你想改进什么

如果您试图提高检索特定MyObject所需的时间,那么使用贴图是一个不错的方法

如果您试图提高内存使用率,那么有几种技术可以使用。您可以坚持使用地图,使用字符串插入以及设置地图的大小,但这只有在您事先知道某些事情的情况下才能起作用