Java中的自定义数据结构

时间:2014-04-29 14:01:46

标签: java algorithm data-structures

我正在寻找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);
    }
}

4 个答案:

答案 0 :(得分:2)

你基本上需要Map(最好是基于散列的)和SortedSet(可能是TreeSet)。

Map<Key,Value> byKeySet<Key> byValue

第一张地图将包含自然键的比较器,而第二张地图将首先使用Comparator首先使用byKey.get(key1).compareTo(byKey.get(key2)),并且只有在它们被视为相等时才使用自然Key比较。

添加:

  • 检查元素是否已存在,如果是 - 从byValue中取出。
  • 修改byKey
  • 中的值
  • 将元素添加到byValue

请注意,这可确保通过增加给定值的值来排序Set

假设地图是基于散列的,并且其中的每个操作平均为O(1),它会为您提供O(logn)运行时间(从byValue移除并添加到其中)。

答案 1 :(得分:1)

您可以使用HashMap的组合来存储键/值,将HashMap存储到键/计数器,并使用TreeMap<Integer, List<Key>>来存储已排序的列表。

即。你需要一个现有收藏的组合,因为你不会找到一个可以完成所有事情的收藏。

答案 2 :(得分:0)

使用HashMap,然后使用if HashMap contains key,只需增加与之关联的值。

答案 3 :(得分:0)

尝试番石榴Multiset。它完全符合您的要求。