Java中的自定义数据结构

Java中的自定义数据结构,java,algorithm,data-structures,Java,Algorithm,Data Structures,我正在寻找一种Java数据结构,它可以实现以下功能: 它包含键、值对 如果密钥已经存在,我可以执行“添加”操作 增加值中的计数器,否则会添加一个新键value 配对到数据结构 每次添加时,数据结构都会自动重新排序,以便根据值对键、值对进行排序 最好所有这些操作的时间复杂度都是对数的(或者更少,但我想这很难) 我如何管理这样的事情,或者是否已经实现了这样的事情 编辑 private HashMap<String, Integer> keyMap; private TreeSet&l

我正在寻找一种Java数据结构,它可以实现以下功能:

  • 它包含键、值对
  • 如果密钥已经存在,我可以执行“添加”操作 增加值中的计数器,否则会添加一个新键value 配对到数据结构
  • 每次添加时,数据结构都会自动重新排序,以便根据值对键、值对进行排序
  • 最好所有这些操作的时间复杂度都是对数的(或者更少,但我想这很难)
我如何管理这样的事情,或者是否已经实现了这样的事情

编辑

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);
    }
}
私有HashMap键映射;
私有树集值集;
公共多集(){
比较器比较器=新比较器(){
@凌驾
公共整数比较(字符串键1、字符串键2){
返回keyMap.get(key1.compareTo)(keyMap.get(key2));
}
};
keyMap=newhashmap();
valueSet=新树集(比较器);
}
公共无效添加(字符串键){
if(键映射。容器键(键)){
移除(键);
keyMap.put(key,keyMap.get(key)+1);
valueSet.add(键);
}否则{
键映射。放置(键,1);
}
}

使用一个
HashMap
然后
如果HashMap包含key
您只需增加与之关联的值。

您可以使用HashMap的组合来存储key/value、HashMap到key/counter以及
树映射到排序列表


i、 e.你需要一个现有集合的组合,因为你不会发现只有一个集合可以做所有事情。

你基本上需要一个
映射(最好是基于哈希的),和一个(可能是一个)

Map by key
Set by value

第一个映射将有自然键的比较器,而第二个映射将有一个首先使用
byKey.get(key1.compareTo(byKey.get(key2))
的比较器,并且只有当它们被认为相等时,才使用自然键
比较器

加:

  • 检查元素是否已存在,如果已存在,请从
    byValue
    中将其取出
  • 按键修改
    中的值
  • 将元素添加到byValue
请注意,这可确保通过增加给定值的值来排列
集合


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

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

数据结构基于值或键重新排序(排序)?基于值,我想得到-例如-所有具有最高值的键中的前5个。OK,告诉我们,如果它添加一个新键,值对,值是从零开始还是从一开始?当然,但是它们不会被排序,如果我想对它们进行排序,我需要在插入所有键之后进行排序。但是我需要一个数据结构,在每次添加操作后对其进行排序如果你有
HashMap
,那么你可以制作一个
Interator
,然后根据你想要的排序打印它。SortedSet还是NavigableSet?一张分类的多重地图怎么样?@PeterLawrey SortedSet。谢谢我看不出多重映射在这里有什么好处,映射的唯一目的是保存与键相关的值(我假设每次只有一个可能的值,它是不断变化的),感谢这看起来它可以做到这一点,我只是困惑我如何能管理这样的东西并实现对数复杂性。谢谢在SortedSet中,大量钥匙的计数相同。多重映射是否有用取决于您希望如何处理多个键具有相同计数的情况。@PeterLawrey这就是为什么我引入了两级比较器,先按值,然后按键。这确保了O(logn)性能。由于
无论如何都是不同的,因此应该使用
(而不是
列表
),否则修改它会获得线性性能。(除非您使用的是跳过列表或类似的内容)。