2011-01-14 44 views
1

我有一个Java地图展望重新排序地图

Map<String, Attributes> 

字符串将应用程序名和属性将是相关的属性。 (属性是一种自定义类型)。我需要根据用户订阅重新订购此地图。我沿着

  1. 发现用户已经订阅了
  2. 创建另一个地图
  3. 寻找每一个在原来的地图,这些应用程序,并在复制值到新地图应用的思路思考新订单

有人可以帮我了解如何实现这个吗?即使这是解决这个问题的最好方法?

非常感谢!

确定添加一个编辑来澄清一些评论。

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

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

如果用户已经订阅APP 2和APP4,我想将它重新排序到:

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

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

+0

“新订单”中的含义是什么?你是否需要按照可预测的顺序迭代Map键?如果是,`SortedMap`或`NavigableMap`可以满足您的需求。如果不是,请详细说明(也许,你的意思是“筛选”而不是“重新排序”)? – 2011-01-14 16:44:05

+0

回声Viktor - Maps *通常*没有明确定义的顺序,因为通常使用它们来查找基于特定键的值。如果你不打算做任何基于关键字的查找,那么也许你不需要这是一个地图毕竟......要考虑的事情。 – 2011-01-14 16:48:28

回答

1

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

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

0

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

+0

SortedMap只能对键进行排序,而不能对值进行排序。 – 2011-01-14 16:44:21

+0

同意,但我认为他诚实地从基于密钥的地图寻找检索,而不是对其进行排序。这是假设“订阅”是关键。 – Riggy 2011-01-14 16:48:53

2

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

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

您可以使用一个SortedMap,如果你想要的是那种基于密钥的事,但因为它似乎你想拥有列表作为最终结果,“订阅应用程序是在列表的顶部”为什么不把它们列为清单?

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

这将插入新进入树中的正确位置。

0

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

你应该有一个类Application包含字段String nameAttributes attributes,然后User将有User.getSubscribedApplications()返回一个List<Application>

Attributes应该可能是Set<Attribute>