- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在一些编程语言中有 Set 集合,它们被认为是有限集数学概念的实现。
然而,这不一定是真的,例如在C#
和 Java
, HashSet<T>
的两个实现允许您添加任何 HashSet<T>
作为自身成员的集合。根据数学集合的现代定义,这是不允许的。
背景:
根据朴素集合论,集合的定义是:
A set is a collection of distinct objects.
然而,这个定义导致了著名的 Russel's Paradox以及其他悖论。为方便起见,罗素悖论是:
Let R be the set of all sets that are not members of themselves. If R is not a member of itself, then its definition dictates that it must contain itself, and if it contains itself, then it contradicts its own definition as the set of all sets that are not members of themselves.
所以根据现代集合论(参见:ZFC),集合的定义是:
A set is a collection of distinct objects, none of which is the set itself.
具体来说,这是 axiom of regularity 的结果.
那又怎样?这意味着什么?为什么这个问题出现在 StackOverflow 上?
罗素悖论的含义之一是并非所有集合都是集合。此外,这就是数学家放弃集合定义作为通常的英语定义的地方。所以我相信这个问题在一般的编程语言设计方面具有很大的重要性。
问题:
那么,为什么以某种形式在其设计中使用这些原则的编程语言会在其语言库中实现 Set 时忽略它?
其次,这在数学概念的其他实现中是否常见?
也许我有点挑剔,但如果这些是 Sets 的真正实现,那么为什么要忽略部分定义?
更新
添加了示例行为的 C# 和 Java 代码片段:
Java 代码段:
Set<Object> hashSet = new HashSet<Object>();
hashSet.add(1);
hashSet.add("Tiger");
hashSet.add(hashSet);
hashSet.add('f');
Object[] array = hashSet.toArray();
HashSet<Object> hash = (HashSet<Object>)array[3];
System.out.println("HashSet in HashSet:");
for (Object obj : hash)
System.out.println(obj);
System.out.println("\nPrinciple HashSet:");
for (Object obj : hashSet)
System.out.println(obj);
打印出:
HashSet in HashSet:
f
1
Tiger
[f, 1, Tiger, (this Collection)]
Principle HashSet:
f
1
Tiger
[f, 1, Tiger, (this Collection)]
C# 代码段:
HashSet<object> hashSet = new HashSet<object>();
hashSet.Add(1);
hashSet.Add("Tiger");
hashSet.Add(hashSet);
hashSet.Add('f');
object[] array = hashSet.ToArray();
var hash = (HashSet<object>)array[2];
Console.WriteLine("HashSet in HashSet:");
foreach (object obj in hash)
Console.WriteLine(obj);
Console.WriteLine("\nPrinciple HashSet:");
foreach (object obj in hashSet)
Console.WriteLine(obj);
打印出:
HashSet in HashSet:
1
Tiger
System.Collections.Generic.HashSet`1[System.Object]
f
Principle HashSet:
1
Tiger
System.Collections.Generic.HashSet`1[System.Object]
f
更新 2
关于 Martijn Courteaux 的第二点,即它可以以计算效率的名义完成:
我用 C# 制作了两个测试集。它们是相同的,除了其中之一的添加方法 - 我添加了以下检查:if (this != obj)
其中 obj
是要添加到集合中的项目。
我分别对它们进行了计时,它们将添加 100,000 个随机整数:
有检查: ~ 28 毫秒
没有检查: ~ 21 毫秒
这是一个相当显着的性能提升。
最佳答案
编程语言集确实不像 ZFC 集,但原因与您想象的完全不同:
你不能通过理解形成一个集合(即所有对象的集合......)。请注意,这已经阻止了所有(我相信)朴素的集合论悖论,因此它们是无关紧要的。
它们通常不可能是无限的。
存在不是集合的对象(在 ZFC 中只有个集合)。
它们通常是可变的(即您可以向集合中添加元素/从集合中删除元素)。
它们包含的对象可以是可变的。
所以答案
So why would programming languages, who in some form, use these principles in their very design just ignore it in the implementation of the Set in their languages libraries?
是语言不使用这些原则。
关于c# - 为什么很多编程语言中的集合并不是真正的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552664/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!