- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Note: Although my particular context is Objective-C, my question actually transcends programming language choice. Also, I tagged it as "subjective" since someone is bound to complain otherwise, but I personally think it's almost entirely objective. Also, I'm aware of this related SO question, but since this was a bigger issue, I thought it better to make this a separate question. Please don't criticize the question without reading and understanding it fully. Thanks!
我们大多数人都熟悉 dictionary abstract data type存储键值关联,我们是否将其称为映射、字典、关联数组、哈希等,具体取决于我们选择的语言。字典的简单定义可以概括为三个属性:
任何其他属性都可以说是为了特定目的的便利或专门化。例如,某些语言(尤其是脚本语言,如 PHP 和 Python)模糊了字典和数组之间的界限,并为字典提供了排序。尽管这很有用,但这样的添加并不是字典的基本特征。从纯粹的意义上讲,字典的实际实现细节是无关紧要的。
对于我的问题,最重要的观察是未定义键的枚举顺序 — 字典可以按照它认为最方便的任何顺序提供键,这取决于客户根据需要组织它们。
我已经 created custom dictionaries强加特定的键顺序,包括自然排序顺序(基于对象比较)和插入顺序。很明显,将前者命名为 SortedDictionary 上的一些变体(我实际上已经实现了),但后者问题更大。我看过LinkedHashMap和 LinkedMap (Java),OrderedDictionary (.NET), OrderedDictionary (闪光灯),OrderedDict (Python)和 OrderedDictionary ( Objective-C )。其中一些更成熟,一些更符合概念验证。
LinkedHashMap 是根据 Java 集合传统中的实现命名的——“链接”是因为它使用双向链表来跟踪插入顺序,而“散列”是因为它是 HashMap 的子类。除了用户不需要担心这一点之外,类名甚至没有真正表明它的作用。使用 ordered 似乎是现有代码之间的共识,但是关于这个主题的网络搜索也揭示了“ordered”和“sorted”之间可以理解的混淆,我也有同感。 .NET 实现甚至对明显的用词不当有评论,并建议它应该改为“IndexedDictionary”,因为您可以在顺序中的特定点检索和插入对象。
我正在设计一个框架和 API,我想尽可能智能地命名类。从我的角度来看,indexed 可能会起作用(取决于人们如何解释它,并基于字典的广告功能),ordered 是不精确的并且有太多的潜力困惑,链接“马上就出来了”(向 Monty Python 道歉)。 ;-)
作为用户,什么名称对您来说最有意义?是否有一个特定的名称可以准确说明该类的作用? (如果合适的话,我不反对使用稍长的名称,例如 InsertionOrderDictionary。)
编辑:另一个很强的可能性(在我下面的回答中讨论)是IndexedDictionary。我不太喜欢“插入顺序”,因为如果您允许用户在特定索引处插入键、对键重新排序等,它就没有意义。
最佳答案
我投票给 OrderedDictionary,原因如下:
"Indexed"从不在 Cocoa 类中使用,除了在一个实例中。它总是作为名词出现(NSIndexSet、NSIndexPath、objectAtIndex: 等)。 “Index”作为动词出现只有一种情况,即 NSPropertyDescription 的“indexed”属性:isIndexed 和 setIndexed。 NSPropertyDescription 大致类似于数据库中的表列,其中“索引”指的是优化以加快搜索时间。因此,当 NSPropertyDescription 成为核心数据框架的一部分时,“isIndexed”和“setIndexed”将等同于 SQL 数据库中的索引。因此,将其称为“IndexedDictionary”似乎是多余的,因为创建数据库中的索引是为了加快查找时间,但字典已经 的查找时间为 O(1)。但是,将其称为“IndexDictionary”也是用词不当,因为 Cocoa 中的“索引”指的是位置,而不是顺序。两者在语义上是不同的。
我理解您对“OrderedDictionary”的担忧,但在 Cocoa 中已经有了先例。当用户想要维护一个特定的序列时,他们使用“有序”:-[NSApplication orderedDocuments]、-[NSWindow orderedIndex]、-[NSApplication orderedWindows] 等。因此,John Pirie 的想法基本上是正确的。
但是,您不想让插入字典成为用户的负担。他们希望创建字典一次,然后让它保持适当的顺序。他们甚至不想按特定顺序请求对象。订单规范应在初始化期间完成。
因此,我建议将 OrderedDictonary 设为一个类簇,其中包含 InsertionOrderDictionary 和 NaturalOrderDictionary 以及 CustomOrderDictionary 的私有(private)子类。然后,用户只需像这样创建一个 OrderedDictionary:
OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc
对于 CustomOrderDictionary,您可以让他们给您一个比较选择器,甚至(如果他们运行 10.6)一个 block 。我认为这将为 future 的扩展提供最大的灵 active ,同时仍保持适当的名称。
关于objective-c - 命名以可预测顺序存储键的字典结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022269/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!