希望重新排序地图

时间:2011-01-14 16:37:21

标签: java

我有一张java地图

Map<String, Attributes>

String将是应用程序名称,属性将是关联的属性。 (属性是自定义类型)。我需要根据用户订阅重新排序此Map。我正在思考

  1. 查找用户已订阅的应用程序
  2. 创建另一个地图
  3. 在原始地图中查找每个应用程序,并按新顺序将值复制到新地图
  4. 有人可以帮我解决这个问题吗?即使这是解决这个问题的最佳方法吗?

    非常感谢!

    好的,添加一个编辑来澄清一些评论。

    原始地图包含所有可用的应用,它看起来像:

    "app1", "attribute1, attribute2, attribute3"
    "app2", "attribute1, attribute2, attribute3"
    "app3", "attribute1, attribute2, attribute3"
    "app4", "attribute1, attribute2, attribute3"
    

    如果用户订阅了app2和app4,我想将其重新排序为:

    "app2", "attribute1, attribute2, attribute3"
    "app4", "attribute1, attribute2, attribute3"
    "app1", "attribute1, attribute2, attribute3"
    "app3", "attribute1, attribute2, attribute3"
    

    以便他们订阅的应用程序位于列表的顶部(该列表用于填充Spring JSP页面)。因此,当用户看到应用页面时,他们可以首先看到他们拥有的内容以及可用的其他内容。

5 个答案:

答案 0 :(得分:2)

地图是无序集合。如果您需要订单中的属性,我建议您将它们添加到列表中,并使用自定义比较器对它们进行排序。 e.g。

Map<String, Attributes> map =
List<Attributes> list = new ArrayList<Attributes>(map.values());
Collections.sort(list, myComparator);

如果你想要做的就是根据键进行排序,你可以使用SortedMap,但是因为它看起来你想让列表作为最终结果,“订阅的应用程序位于列表的顶部”为什么不对它们进行排序作为清单?

答案 1 :(得分:1)

LinkedHashMap可能正是您要找的。它保留了项目的插入顺序,但仍允许您使用其键查找它们。

如果您按照希望它们的顺序将项目放入LinkedHashMap,当您在地图上调用.values()时,它们将保持该顺序。

答案 2 :(得分:0)

我认为你正在寻找一个SortedMap而不是一个基本的地图。谷歌的“SortedMap示例”,你会发现很多有用的例子。

答案 3 :(得分:0)

地图通常没有订购,但您可以使用TreeMap作为有序地图(实际上是SortedMap)。您将创建它,将Comparator传递给构造函数:

Map<String,Attributes> myMap = new TreeMap<String,Attributes>(myComparator);

这也允许按照比较器指定的顺序通过迭代器快速遍历地图。

Comparator<String> myComparator = new Comparator<String>() {
    public int compare(String str1, string str2) {
        return str1.compareTo(str2); 
    }
};

现在为地图添加值:

myMap.put(userAttr.getFieldToOrderBy(), userAttr);

它会将新条目插入树中的正确位置。

答案 4 :(得分:0)

隐藏的答案是重新考虑你的设计。

您应该有一个包含字段ApplicationString name的课程Attributes attributes,然后UserUser.getSubscribedApplications()返回List<Application>。< / p>

Attributes应该是Set<Attribute>