Java 正在查看地图的重新排序

Java 正在查看地图的重新排序,java,Java,我有一张java地图 Map<String, Attributes> 如果用户已订阅app2和app4,我想将其重新排序为: "app2", "attribute1, attribute2, attribute3" "app4", "attribute1, attribute2, attribute3" "app1", "attribute1, attribute2, attribute3" "app3", "attribute1, attribute2, attribute3"

我有一张java地图

Map<String, Attributes>
如果用户已订阅app2和app4,我想将其重新排序为:

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

因此,他们订阅的应用程序位于列表的顶部(该列表用于填充SpringJSP页面)。因此,当用户看到应用程序页面时,他们可以首先看到自己拥有的应用程序,然后再看到其他可用的应用程序。

我想你是在寻找一张地图,而不仅仅是一张基本地图。谷歌搜索“分类地图示例”,你会发现很多有用的示例。

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

地图=
列表=新的ArrayList(map.values());
Collections.sort(列表,myComparator);

如果您只想根据键进行排序,那么您可以使用SortedMap,但由于您似乎希望将列表作为最终结果,“订阅的应用程序位于列表的顶部”为什么不将它们作为列表进行排序?

地图通常不按序排列,但您可以使用a作为有序地图(实际上是a)。您将通过向构造函数传递

Map<String,Attributes> myMap = new TreeMap<String,Attributes>(myComparator);
它会将新条目插入树中的正确位置。

可能就是您要查找的内容。它保留项目的插入顺序,但仍允许您使用其键查找项目


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

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

您应该有一个类
应用程序
包含字段
字符串名称
属性
,然后
用户
将有
用户.getSubscribedApplications()
,它返回一个
列表


Attributes
可能应该是
Set

你说的“新顺序”是什么意思?是否需要按可预测的顺序迭代映射键?如果是,
SortedMap
NavigableMap
可能适合您的需要。如果没有,请详细说明(也许你指的是“过滤”而不是“重新排序”)?回音Viktor-Maps通常没有明确定义的顺序,因为你通常使用它们来查找基于特定键的值。如果你不打算做任何基于键的查找,那么也许你根本不需要这张地图。。。一个排序的地图只能在键上排序,而不是按值排序。同意,但我认为他是诚实地寻找基于键的地图检索,而不是排序。这是假设“订阅”是关键。谢谢各位。是的,我想根据地图(关键)的“字符串”部分(即应用程序名称)进行搜索。投票否决重新发明轮子。Treemap或SortedMap将为您执行此操作。@Woot4Moo:实际上,不,SortedMap将对键进行排序,而不是对值进行排序。@Christoff是的,我知道。基于OP:
字符串将是一个应用程序名
和查找用户订阅的应用程序的
。当然,他的问题还没有完全解决baked@Woot4Moo:Peter正在按值排序,而SortedMap没有。@Woot4Moo,当您有一个属性的通用表时,您可能需要对任何列进行排序。我意识到这只是一个示例,但是您可能应该注意到,当没有指定比较器时,比较器是冗余的,因为它执行与树映射相同的默认比较。
Map<String, Attributes> map =
List<Attributes> list = new ArrayList<Attributes>(map.values());
Collections.sort(list, myComparator);
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);