存储三元或三态变量的最佳数据类型


13

免责声明:我知道数据类型有点受制于所使用的脚本/编程语言,我喜欢用Python编写;尽管我很高兴听到有关任何语言/实现的信息。

存储三态变量的最佳数据类型是什么?能够或代表积极,中立和消极的东西。

例如:整数-101

  • 优点:非常简洁。
  • Pro:可能有效,可以存储为单个2位带符号整数。
  • 专业版:可用作刻度,例如浮点乘数。

实施例2: ,0null1或任何排列)

  • 优点:非中立的用例可以是二进制的。
  • 缺点:需要动态数据类型
  • 缺点:可能不太简洁。

实施例3: ,+空字符串),-

  • 优点:非常简洁。
  • 缺点:可以利用字符串逻辑来确定状态。
  • Pro ?:直观的图形表示。

也许有一些聪明的二进制逻辑可以做我什至无法想象的聪明事,也许有太多用例考虑。

另外,在调整三元状态以存储在数据库引擎中时,是否需要考虑任何因素?像Innodb供参考。


12
枚举pythonjavaC#CC ++ ...

同上,但是我要补充一点,在许多语言中,枚举类型比尝试将它们塞入其他类型为您提供了更多的安全性。
Blrfl 2014年

4
这个问题在很大程度上取决于用例。通常,列出的所有实现选择似乎都适合于不同时间的某些不同目的。
rwong 2014年

2
在.NET中,您可以使用可为空的布尔值。大多数数据库将允许您存储具有可为空状态的布尔值(或通常称为位)。您还可以使用char进行存储。字符将在以后的时间提供更多空间,而无需更改存储机制。
亚当·祖克曼

1
指向布尔的指针也可以使用。布尔被强制为0和1,如果指针为NULL,则您处于第三个状态。当然要取决于语言。
Devolus

Answers:


7

除了一个表达方式最明显,最清晰的枚举外,用于无法互操作特定语言的枚举的互操作系统是-1/0/1选项。

不过,您可能想尝试使用位掩码,其中0表示0,1表示“ bit 2 set”,而2表示“ bit 3 set”(即,您可以打开或关闭3位。只要您不定义3,或者设置1和2位,那么你就很好了。如果您认为将来可能需要4个或更多标志(4、8、16等设置后续位),则此选项最佳。

所有这些都适合单个8位数据类型,因此不会浪费内存或进行转换(就像基于字符的系统一样,有时会使用16位字符,有时会根据平台使用8位字符)。

在任何情况下我都不会考虑null。也许在数据库中,但只有在我可以保证系统对NULL的独特支持的情况下,即使这样,如果有人没有明确进行区分并且当它真正为null时以0结尾,则可能容易出错。


IMO的最佳答案。NULL可能是它没有被添加到数据库中,不是它的状态是具有-1,0,1且可能为NULL的'NULL'-NULL表示该字段从未填充过!
肯(Ken)

3

我无意直接对这个问题写清楚的答案;正如我上面所推荐的,这个问题高度依赖于用例。通常,列出的所有实现选择似乎在不同的时间适合于某些不同的目的。

但是,我想提请您注意这些基本原则和背景知识,以便您可以自己做出明智的决定。


轻松一点,也请读这个笑话:“一位商人问一位会计师;二加二是什么?”

向所有会计师和非会计师道歉。我提到这个笑话的目的是强调我们将很快定义的某些事物的自由以及随之而来责任和后果(从逻辑上讲)。


问题:三值逻辑的真值表是什么?

回答:

...从他的椅子上站起来,走向门,关上门,回来坐下。斜倚在桌子上,

...并在一张纸上抽出一张手绘图。

操作:逻辑和-机密-2014年第三季度草案

   FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????

......他用低沉的声音说,“ 多少钱你会喜欢那些神奇的价值观是什么?”

图形设计师问程序员:“您能举一个三值逻辑的例子吗?”

程序员回答:“您能给我两种颜色,尽可能黑白两种?”

平面设计师:“那么……黑与白?”

程序员:“是的。现在我要提供第三种颜色-但我必须将其指定为ARGB数字。希望您不要介意。”

平面设计师:“好吧,我每天都与ARGB合作...”

Black#FF000000
White#FFFFFFFF
Nothing#00000000

备注。在上面,黑色和白色是完全不透明的颜色。第三种颜色“无”是完全透明的。当以各种比例混合在一起时,黑白混合会变成各种灰色,但是“混合”不会改变任何东西。


我对使用真值表非常感兴趣,再次打开了我自己问题背后含义的视线。
ThorSummoner 2014年

1

如果这三种可能的状态具有某些固有含义,请使用适合该固有含义的某种内容。例如,可能的状态是1、2或3,或者如果它们是100、200和300,则使用整数。如果可能的状态是“是”,“否”或“未知”,则可以使用可选的布尔值或指向布尔对象的指针,并可能没有值,“是”值或“否”值。虽然有些人可能不喜欢它。

如果有一种明显的方式可以将整数解释为可能的状态,则可以使用整数。假设状态为“少”,“等于”,“更大”的比较函数可能使用-1、0和+1。虽然有些人可能找不到明显的东西,但您却发现明显的东西。

如果有一种明显的方式可以将字母解释为可能的状态,则可以使用一个字符。例如,如果您的状态是“红色”,“绿色”或“蓝色”,则可以使用字母“ r”,“ g”和“ b”。同样,对您来说显而易见的是...

枚举类型始终是可能的。字符串始终是可能的,但是大多数语言都会丢失类型检查。

某些人使用三个布尔值来表示“处于状态1”,“处于状态2”,“处于状态3”。

无论您做什么,都应该以尝试使用显而易见的,可以理解的东西为指导,如果突然有四个状态,也不会给您带来麻烦,让编译器尽可能地发现错误。


0

存储三态变量的最佳数据类型是什么?能够或代表积极,中立和消极的东西。

这在很大程度上取决于语言,您在做什么,抽象级别(这也取决于语言等)。

我主要使用C ++,这里有很多选择。最简单的是enum tribool_state { false_val, true_val, undetermined_val }。如果您的使用场景是返回此类型值的单个函数,这将足够。

boost::optional<bool>如果我想表达可能无法获得的布尔结果,则可能会用到(例如,检查接收到的网络数据是否完整,然后处理布尔值)。

我会用boost::tribool,如果我想表达的模糊布尔结果支持全三态布尔逻辑(例如true || indetermined -> truefalse && indetermined -> falsetrue && indetermined -> indetermined等)。

同样,在python中,我将使用一组常量或一个类(同样,这取决于我在客户端代码中需要哪种语义/操作):

例如,我将使用:

POSITIVE, INDETERMINED, NEGATIVE = 1, 0, -1

如果我有一个简单的函数返回三个结果之一的情况。

如果我有一个需要三态布尔逻辑的完整库,则可以将值类型实现为一个类。


0

如果使用Java,则可以使用布尔对象:由于它是一个对象并且包含布尔值,因此可以保存值true,false和null。我不确定这是否是最好的方法。


-6

在Microsoft.NET中,有一种“元组”类型可以用于您的需求。访问http://msdn.microsoft.com/zh-cn/library/system.tuple%28v=vs.110%29.aspx


每页:元组是一种具有特定数量和顺序的元素的数据结构。元组的示例是具有三个元素(称为三元组或三元组)的数据结构,该数据结构用于存储标识符,例如在第一个元素中存储人的姓名,在第二个元素中存储年份以及人的收入在第三年中 .NET Framework直接支持具有1到7个元素的元组。此外,您可以通过在Tuple <T1,T2,T3,T4,T5,T6,T7,TRest>对象的Rest属性中嵌套元组对象来创建八个或更多元素的元组。
亚当·祖克曼

1
那就是说,一个元组最多可以存储一个八进制(8维)的任何类型。
亚当·祖克曼


我的选择语言Python也包含一个元组数据类型,无论如何,一点阅读对我来说都表明元组适合于三元数据。或者元组索引的值可能是用例要存储的数据,而元组更像是一个常量。在我看来,关于按索引引用全局常数甚至是局部常数的事情对我来说似乎是一种差劲的做法,除非您处于禁止奢侈品的约束之下。
ThorSummoner 2014年

2
元组是一种数据类型,它可以存储仅动态定义的多个元素(如结构)。因此它将存储3个OP所需类型的变量。它无助于限制他想要的内容。
gbjbaanb 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.