我正在寻找Java中可以执行以下操作的数据结构:
我如何管理这样的事情或者是否已经实施了某些事情?
修改
private HashMap<String, Integer> keyMap;
private TreeSet<String> valueSet;
public MultiSet() {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String key1, String key2) {
return keyMap.get(key1).compareTo(keyMap.get(key2));
}
};
keyMap = new HashMap<String, Integer>();
valueSet = new TreeSet<String>(comparator);
}
public void add(String key) {
if (keyMap.containsKey(key)) {
valueSet.remove(key);
keyMap.put(key, keyMap.get(key) + 1);
valueSet.add(key);
} else {
keyMap.put(key, 1);
}
}
答案 0 :(得分:2)
你基本上需要Map
(最好是基于散列的)和SortedSet
(可能是TreeSet
)。
Map<Key,Value> byKey
和Set<Key> byValue
第一张地图将包含自然键的比较器,而第二张地图将首先使用Comparator首先使用byKey.get(key1).compareTo(byKey.get(key2))
,并且只有在它们被视为相等时才使用自然Key
比较。
添加:
byValue
中取出。byKey
请注意,这可确保通过增加给定值的值来排序Set
。
假设地图是基于散列的,并且其中的每个操作平均为O(1),它会为您提供O(logn)
运行时间(从byValue
移除并添加到其中)。
答案 1 :(得分:1)
您可以使用HashMap的组合来存储键/值,将HashMap存储到键/计数器,并使用TreeMap<Integer, List<Key>>
来存储已排序的列表。
即。你需要一个现有收藏的组合,因为你不会找到一个可以完成所有事情的收藏。
答案 2 :(得分:0)
使用HashMap
,然后使用if HashMap contains key
,只需增加与之关联的值。
答案 3 :(得分:0)
尝试番石榴Multiset。它完全符合您的要求。