我有一张java地图
Map<String, Attributes>
String将是应用程序名称,属性将是关联的属性。 (属性是自定义类型)。我需要根据用户订阅重新排序此Map。我正在思考
有人可以帮我解决这个问题吗?即使这是解决这个问题的最佳方法吗?
非常感谢!
好的,添加一个编辑来澄清一些评论。
原始地图包含所有可用的应用,它看起来像:
"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页面)。因此,当用户看到应用页面时,他们可以首先看到他们拥有的内容以及可用的其他内容。
答案 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)
隐藏的答案是重新考虑你的设计。
您应该有一个包含字段Application
和String name
的课程Attributes attributes
,然后User
会User.getSubscribedApplications()
返回List<Application>
。< / p>
Attributes
应该是Set<Attribute>
。