建模无序列表(即一组)的最佳方法是什么?

时间:2008-12-11 18:59:18

标签: language-agnostic

对构成一组的一组对象进行建模的最自然的方法是什么?例如,您可能有一堆用户对象,他们都是邮件列表的订阅者。

显然你可以将它建模为一个数组,但是你必须对这些元素进行排序,并且使用你的界面的人可能会对你为什么编码任意排序数据感到困惑。

您可以使用散列,其中成员是映射到“1”或“true”的键,但在大多数语言中,散列键的数据类型都有限制。

在现代语言(PHP,Perl,Ruby,Python等)中执行此操作的标准方法是什么?

7 个答案:

答案 0 :(得分:1)

在Python中,您将使用set数据类型。 set支持包含任何可哈希对象,因此如果您需要将自定义类存储在集合中并且默认的可缓存行为不合适,则可以实现__hash__来实现所需的行为。

答案 1 :(得分:1)

C#具有HashSet< T>。通用集合。

public class EmailAddress  // probably needs to override GetHashCode()
{
   ...
}

var addresses = new HashSet<EmailAddress>();

答案 2 :(得分:1)

大多数现代语言都将采用某种形式的Set数据结构。 Java有HashSet,它实现了Set接口。

在PHP中,您可以使用数组来存储数据。在添加新元素之前搜索数组,或在插入所有元素后使用array_unique删除重复项。

答案 3 :(得分:0)

在c中作为直接了解机器的替身:

  • 对于小的,离散的和明确定义的范围:使用按位数组来指示每个可能项目的存在(设置为当前,未设置为不存在)。
  • 对所有其他情况使用哈希表。

根据需要编写函数以实现添加和删除项目,测试是否存在,测试子集等。


然而,正如其他答案所指出的,如果您只是想要这个功能,请使用已经过良好调试的语言功能或第三方库。

答案 4 :(得分:0)

很多时候基于散列的集合是正确的使用方法,但是如果你不需要进行基于密钥的查找而不担心强制执行唯一值,那么矢量或列表就可以了。毕竟,哈希表有开销。

您似乎担心人们会认为向量中的顺序很重要,但我认为这是一种常见的用法,通过文档,您不应该混淆人。

这实际上取决于您希望如何访问和使用数据。

答案 5 :(得分:0)

和Array通常是存储数据的最简单方法,没有任何其他要求。通常使用其他数据类型有不同的原因(你想要追加数据,你想要在恒定时间内搜索数据,你需要快速设置联合/交集等)如果你唯一关心的是抽象,你可以把它包装成某种形式无序的门面。

答案 6 :(得分:0)

在Perl中,我肯定会使用哈希。在其他语言中,我会哀叹缺乏哈希。