当前位置: 首页 > 知识库问答 >
问题:

具有唯一键的成对排序列表的Java结构建议

呼延曜灿
2023-03-14

一个结构k=

让我们有[35=

我可以使用Java中最快的结构是什么,以便根据一些输入数据创建它,并从左边以“一个接一个”的方式进一步迭代它。SortedHashMap


共有3个答案

龙承德
2023-03-14

如果您不需要增量构建,我会:

List<Pair> pairs = ...;
Collections.sort(pairs, new Comparator<Pair>() {
    @Override public int compare(Pair p1, Pair p2) {
        return p1.v - p2.v;
    }
}
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
map.addAll(pairs); // retains insertion order
return map;
贺轶
2023-03-14

我不认为有一个现有的结构。

SortedMap不适合您,因为它使用键而不是值进行排序。

我将使用HashMap并在将entrySet复制到列表中的附加方法中实现排序。列表将使用比较值的自定义比较器进行排序。

如果性能是一个大问题,那么您应该考虑实现自己的结构。有很多种可能性可以做到这一点,我们不能说什么是最快的。这取决于您希望执行的操作的频率。

后星河
2023-03-14

不久前,我遇到了类似的情况;我并行使用了两张地图:

>

  • AHashMap

    一个树形图

    通过并行维护这两个结构,可以始终对您的对进行排序,而无需使用键作为排序值。

    添加一对:

    M.put(key, pair);
    S.put(pair, pair);
    

    要通过密钥获取配对,请执行以下操作:

    M.get(key);
    

    要删除配对,请执行以下操作:

    P pair = M.get(key);
    M.remove(key);
    S.remove(pair);
    

    要获得已排序的配对列表,请执行以下操作:

    S.keySet();
    

    核心业务的平均复杂度为:

    • 添加:O(logn)TreeMap)

  •  类似资料:
    • 问题内容: 会根据其位置而不是其值来生成其元素被视为唯一的元素。所以基本上我想避免重复这样的事情: 之后的过滤是不可能的,因为在我的情况下,排列的数量太大。 有人知道合适的算法吗? 非常感谢你! 编辑: 我基本上想要的是以下内容: 这是不可能的,因为sorted创建列表并且itertools.product的输出太大。 抱歉,我应该已经描述了实际问题。 问题答案: 结果: 编辑(这是如何工作的):

    • 问题内容: 这个问题需要一些假设的背景。让我们考虑一个有列的表,,,,使用MySQL作为RDBMS。由于如果给定的某个人的名字和出生日期与另一个人相同,那么根据定义,他们就是同一个人(除非有两个巧合,即我们两个人分别于1809年2月12日出生,他们叫亚伯拉罕·林肯),所以我们将上的唯一键,这意味着“不要将同一个人存储两次”。现在考虑以下数据: 如果现在尝试运行以下语句,则该语句应该并且将失败: 如

    • 我正在运行Postgres 9.5,并试图基于3个字段创建一个唯一的约束。我遇到的问题是,其中两列可以为NULL,因此这些字段为NULL的行不会违反唯一约束。我的目标是将其作为一个约束,因为我正在尝试更新冲突(UPSERT)。 桌子的结构是这样的 我在这里发现了另一个问题,我可以按照以下方式做一些事情 我不确定在where子句中有两个字段时这是否真的有效,但如何在冲突时调用这个唯一索引呢? 或者我

    • 问题内容: 我在Postgres DB中有两个名为&的表,如下所示: 如何确保仅将或的唯一组合用于主键,以便表不允许插入以下内容: 如果已经有包含like的行: 目的是避免相同玩家之间的比赛进入。 问题答案: 创建一个唯一索引: 不能是或约束,因为它们仅适用于列,不适用于表达式。 您可以添加一个列作为PK,但是只有两个整数列,原始PK也非常有效(请参阅注释)。它会自动使两列都变为。(否则,添加约束

    • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数

    • 我有五个属性的列表,每个属性有五个不同的值。我想生成它们的笛卡尔乘积,并过滤所有独特的排列。 一些背景: 我需要它们作为我的输入值来解决逻辑难题。在那里我对照他们检查规则以找到正确的解决方案。 也许一个简化的例子就能说清楚。 数据: 数据的笛卡尔乘积: 我想要的是: 我不想要的是: 我不希望同一个值多次出现。位置很重要,因此它应该具有置换性质,对于包含五个元素的列表,它应该具有置换性质。我猜输出大