建模一组对象的最自然的方式是什么?例如,您可能有一群用户对象都是邮件列表的订阅者。模拟无序列表(即集合)的最佳方式是什么?
显然你可以将它建模为一个数组,但是你必须对这些元素进行排序,任何使用你的接口的人可能会对你为什么编码任意排序数据感到困惑。
如果成员是映射为“1”或“true”的键,则可以使用散列,但在大多数语言中,散列键的数据类型可能存在限制。
什么是现代语言(PHP,Perl,Ruby,Python等)的标准方式?
建模一组对象的最自然的方式是什么?例如,您可能有一群用户对象都是邮件列表的订阅者。模拟无序列表(即集合)的最佳方式是什么?
显然你可以将它建模为一个数组,但是你必须对这些元素进行排序,任何使用你的接口的人可能会对你为什么编码任意排序数据感到困惑。
如果成员是映射为“1”或“true”的键,则可以使用散列,但在大多数语言中,散列键的数据类型可能存在限制。
什么是现代语言(PHP,Perl,Ruby,Python等)的标准方式?
在Python中,您将使用set
数据类型。 A set
支持包含任何可哈希对象,因此如果您需要将一个自定义类存储在一个集合中,并且默认可哈希行为不合适,则可以实现__hash__
以实现所需的行为。
C#拥有HashSet <T>泛型集合。
public class EmailAddress // probably needs to override GetHashCode()
{
...
}
var addresses = new HashSet<EmailAddress>();
大多数现代语言将会有某种形式的Set数据结构。 Java有HashSet,它实现了Set接口。
在PHP中,您可以使用数组来存储数据。在添加新元素之前搜索数组,或在插入所有元素后使用array_unique删除重复项。
在C作为一个独立的在用于理解直接在机器:
编写函数以实现添加和删除项目,测试存在或不存在,测试子集等(如需要)。
但是,如果您只想使用功能,请使用已调试良好的语言功能或第三方库。
很多时候基于散列的套是使用了正确的事情,但如果你不需要做基于密钥的查找和不用担心强制执行唯一值,载体或列表的罚款。毕竟,哈希表存在开销。
你似乎是担心有人会认为,向量中的顺序很重要,但我认为这是一种常见的足够的使用,与文档,你不应该混淆的人。
这实际上取决于您希望如何访问和使用数据。
和Array通常是存储数据,而没有任何其它要求的最简单的方法。通常,其他数据类型会因为不同的原因而被使用(您想追加数据,您想要在常量时间内搜索数据,需要快速设置联合/交集等)。如果您唯一担心的是抽象,则可以用某种无序的门面。
在Perl中,我肯定会使用散列。在其他语言中,我会感叹缺乏散列。
哪些其他语言会是? – Jimmy 2008-12-11 20:26:41