Language agnostic 什么';对无序列表(即集合)建模的最佳方法是什么?

Language agnostic 什么';对无序列表(即集合)建模的最佳方法是什么?,language-agnostic,Language Agnostic,对构成一个集合的一组对象建模最自然的方法是什么?例如,您可能有一组用户对象,它们都是邮件列表的订户 显然,您可以将其建模为一个数组,但随后您必须对元素进行排序,无论是谁使用您的接口,都可能会对为什么要对数据进行任意排序感到困惑 可以使用散列,其中成员是映射到“1”或“true”的键,但在大多数语言中,对散列键可以是什么数据类型有限制 在现代语言(PHP、Perl、Ruby、Python等)中,实现这一点的标准方法是什么?在Python中,您将使用数据类型。集合支持包含任何可散列对象,因此,如果您

对构成一个集合的一组对象建模最自然的方法是什么?例如,您可能有一组用户对象,它们都是邮件列表的订户

显然,您可以将其建模为一个数组,但随后您必须对元素进行排序,无论是谁使用您的接口,都可能会对为什么要对数据进行任意排序感到困惑

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


在现代语言(PHP、Perl、Ruby、Python等)中,实现这一点的标准方法是什么?

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

在Python中,您将使用数据类型。
set
支持包含任何可散列对象,因此如果您有一个需要存储在set中的自定义类,并且默认的可散列行为不合适,您可以实现
\uuuuuuhash\ucode>来实现所需的行为。

C>具有散列集通用集合

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

var addresses = new HashSet<EmailAddress>();
public类EmailAddress//可能需要重写GetHashCode()
{
...
}
var addresses=newhashset();
C#具有HashSet泛型集合

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

var addresses = new HashSet<EmailAddress>();
public类EmailAddress//可能需要重写GetHashCode()
{
...
}
var addresses=newhashset();

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


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

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


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

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

  • 对于小的、离散的和定义良好的范围:使用位数组指示每个可能项目的存在(设置为存在,取消设置为不存在)
  • 对所有其他情况使用哈希表
根据需要编写函数以实现添加和删除项、测试是否存在、测试子集等



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

在c中作为直接理解机器的替代:

  • 对于小的、离散的和定义良好的范围:使用位数组指示每个可能项目的存在(设置为存在,取消设置为不存在)
  • 对所有其他情况使用哈希表
根据需要编写函数以实现添加和删除项、测试是否存在、测试子集等



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

很多时候,基于哈希的集是正确的选择,但是如果您不需要进行基于键的查找,也不必担心强制执行唯一值,那么向量或列表就可以了。毕竟,哈希表有开销

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


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

很多时候,基于哈希的集合是正确的选择,但是如果您不需要执行基于键的查找,也不需要担心强制执行唯一值,那么向量或列表就可以了。毕竟,哈希表有开销

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


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

而阵列通常是存储数据的最简单方式,无需任何其他要求。如果您只关心抽象,则通常会出于不同的原因使用其他数据类型(您希望附加数据,您希望在固定时间内搜索数据,您需要快速设置并集/交集等),您可以将其包装在某种无序外观中。

而数组通常是存储数据的最简单方式,没有任何其他要求。通常使用其他数据类型有不同的原因(您希望附加数据,您希望在固定时间内搜索数据,您需要快速设置并集/交集等),如果您只关心抽象,您可以将其包装在某种无序外观中。

在Perl中,我肯定会使用哈希。在其他语言中,我会对缺少哈希表示遗憾。

在Perl中,我肯定会使用哈希。在其他语言中,我会为缺少散列而哀叹。

那会是哪些其他语言?任何没有散列的语言。:)很多都是这样,包括我现在可能使用的任何语言,比如Java。那会是什么其他语言?任何没有哈希的语言。:)它们中有很多都可以,包括我现在可能使用的任何东西,比如Java。