3値変数または3状態変数を格納するのに最適なデータ型


13

免責事項:私はデータ型が使用しているスクリプト/プログラミング言語に少し主観的であることを知っています。好みの問題としてPythonで記述したいのですが。私はどんな言語/実装についても聞いてうれしいです。

3状態変数を格納するのに最適なデータ型は何ですか?ポジティブ、ニュートラル、ネガティブを可能にする、または表す何か。

例:整数-101

  • プロ:非常に簡潔です。
  • 長所:潜在的に効率的、単一の2ビット符号付き整数として格納できます。
  • Pro:浮動小数点乗算器などのスケールとして使用できます。

実施例2: 、0null1または任意の順列)

  • メリット:非中立的なユースケースは、バイナリの場合があります。
  • 欠点:動的データ型が必要です
  • 短所:簡潔ではない可能性があります。

例3:+(空の文字列)、-

  • プロ:非常に簡潔です。
  • 欠点:文字列ロジックを利用して状態を判断する可能性があります。
  • プロ?:直感的なグラフィック表現。

おそらく、私が想像もできないような巧妙なことを実行できる巧妙なバイナリロジックがいくつかあるでしょう。

また、3値状態をデータベースエンジンに格納するように調整する場合の考慮事項はありますか?参考としてInnodbのように。


12
列挙型pythonjavaC#CC ++go ...

イビデムですが、多くの言語で列挙型を使用すると、他の型に角張ろうとするよりもはるかに安全になります。
Blrfl 2014

4
この質問は、ユースケースに大きく依存しています。一般に、リストされている実装の選択肢はすべて、さまざまな目的で、さまざまなタイミングで適切であると思われます。
rwong

2
.NETでは、null許容ブール値を使用できます。ほとんどのデータベースでは、null許容状態でブール値(またはしばしば呼び出されるビット)を格納できます。charをストレージに使用することもできます。charは、ストレージメカニズムを変更する必要なしに、後でより多くのスペースを許可します。
Adam Zuckerman、2014

1
boolへのポインタも使用できる場合があります。Boolは0と1に強制され、ポインターがNULLの場合は3番目の状態になります。もちろん言語に依存します。
Devolus 14

回答:


7

これを表現する最も明白で明確な方法である列挙型とは別に、言語固有の列挙型を表現できない相互運用可能なシステムに使用されるシステムは、-1 / 0/1オプションです。

ただし、ビットマスクを試すこともできます。0は0を意味し、1は「ビット2セット」を意味し、2は「ビット3セット」を意味します(つまり、オンまたはオフにできる3ビットがあります。定義しない限り、 3、またはビット1と2が設定されていれば問題ありません。このオプションは、4、8、16などのフラグが後続のビットを設定するため、将来4つ以上のフラグが必要になると思われる場合に最適です。

これらすべてが単一の8ビットデータ型に収まるため、メモリの浪費や変換の必要がありません(文字ベースのシステムでは、16ビット文字が使用されることもあれば、プラットフォームによっては8ビットが使用されることもあります)。

どんな場合でもnullは考慮しません。多分データベース内ですが、システムがNULLを明確にサポートしていることを保証できた場合に限られます。それでも、誰かが明示的に区別しなかった場合は、エラーが発生しやすく、実際にはnullでした。


ここIMOの最良の答え。NULLは、それがDBに追加されなかっただけである可能性があります。その状態が-1、0、1の「NULL」であり、場合によってはNULLである可能性もあります。nullは、フィールドにデータが入力されなかったことを明確に示します。
Ken

3

この質問に対する明確な回答を直接書くつもりはありません。上記で賞賛したように、この質問はユースケースに大きく依存しています。一般に、リストされている実装の選択肢はすべて、さまざまな目的で、さまざまなタイミングで適切であると思われます。

ただし、これらの基本的な原則と背景知識に注意を向けて、情報に基づいた独自の決定を行えるようにしたいと思います。


軽いメモで、この冗談も読んでください:「ビジネスマンが会計士に尋ねます; 2プラス2は何ですか?」

すべての会計士と非会計士に謝罪。私がこのジョークについて言及したのは、すぐに定義する予定の自由と、それに続く責任と結果(両方とも論理的な意味で)を強調するためです。


質問:3値論理の真理値表とは何ですか?

回答:

...彼の椅子から立ち上がり、ドアに行き、ドアを閉め、戻ってきて座った。机に寄りかかって

...そして一枚の紙に手描きのチャートを引き出します。

運用:論理的-機密-2014年第3四半期のドラフト

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

...彼は低い声で言いました、「あなたはそれらの魔法の価値をどれくらいにしたいですか?」

グラフィックデザイナーはプログラマーに「3つの値を持つロジックの例を挙げられますか?」と尋ねます。

プログラマーは、「可能な限り白黒の2色をくれませんか」と答えます。

グラフィックデザイナー:「だから...黒と白?」

プログラマー:「その通りです。次に3番目の色を指定します。ただし、ARGB番号として指定する必要があります。気にしないでください。」

グラフィックデザイナー:「よくARGBを毎日使っています...」

Black#FF000000
White#FFFFFFFF
Nothing#00000000

リマーク。上記では、黒と白は完全に不透明な色です。3番目の色Nothingは完全に透明です。さまざまな比率で混合すると、黒と白はさまざまなグレーになるように混合されますが、Nothingで混合しても何も変わりません。


私は真理値表の使用に非常に興味があります。自分の質問の背後にある意味に再び目を向けます。
ThorSummoner 2014

1

3つの可能な状態に固有の意味がある場合は、その固有の意味に適したものを使用します。たとえば、可能な状態が1、2、3の場合、または100、200、300の場合は整数を使用します。可能な状態が「はい」、「いいえ」、または「不明」の場合は、オプションのブール値またはブール値オブジェクトへのポインタを使用して、値がない、「はい」値、または「いいえ」値を持つ可能性があります。一部の人々はそれを好きではないかもしれませんが。

整数を可能な状態として解釈する方法が明らかな場合は、整数を使用できます。状態が「より小さい」、「等しい」、「より大きい」の比較関数で、-1、0、+ 1を使用するとします。一部の人々はあなたが明白だと思うものを明白に見つけないかもしれませんが。

文字を可能な状態として解釈する方法が明らかな場合は、文字を使用できます。たとえば、州が「赤」、「緑」、「青」の場合、「r」、「g」、「b」の文字を使用できます。繰り返しますが、あなたにとって明白なことは...

列挙型は常に可能です。文字列は常に可能ですが、ほとんどの言語では型チェックを失います。

「状態1にある」、「状態2にある」、「状態3にある」を表すために3つのブール値を使用する人もいます。

あなたが何をするにせよ、あなたは明白で理解可能な何かを使うことを試みることによって導かれるべきです、突然あなたが4つの状態を持っているならあなたをトラブルに巻き込まないで、そしてコンパイラーができるだけ間違いを見つけましょう。


0

3状態変数を格納するのに最適なデータ型は何ですか?ポジティブ、ニュートラル、ネガティブを可能にする、または表す何か。

これは、言語、実行内容、抽象化レベル(言語にも依存します)に大きく依存します。

私は主に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

3つの結果のいずれかを返す関数の単純なケースがある場合。

代わりに、トライステートのブールロジックを必要とする完全なライブラリがある場合、値の型をクラスとして実装します。


0

Javaを使用している場合は、ブールオブジェクトを使用できます。これはオブジェクトであり、ブールを含んでいるため、true、false、nullの値を保持できます。これが最善の方法かどうかはわかりません。


-6

Microsoft.NETには、要件に使用できる「タプル」タイプがあります。http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspxにアクセスします


そのページごと:タプルは、特定の数と要素のシーケンスを持つデータ構造です。タプルの例は、最初の要素に人の名前、2番目の要素に年、人の収入などの識別子を格納するために使用される3つの要素(3タプルまたはトリプルと呼ばれる)を持つデータ構造です。その年の3番目の要素。.NET Frameworkは、1〜7個の要素を持つタプルを直接サポートします。さらに、Tuple <T1、T2、T3、T4、T5、T6、T7、TRest>オブジェクトのRestプロパティでタプルオブジェクトをネストすることにより、8つ以上の要素のタプルを作成できます。
アダムザッカーマン2014

1
つまり、タプルは最大8倍(8次元)の任意の型を格納できるということです。
Adam Zuckerman、2014


私の選択範囲であるPythonにもタプルデータ型が含まれています。少し読んでみると、とにかくタプルは3値データに適していることがわかります。または、タプルインデックスの値がユースケース用に格納するデータである可能性があり、タプルは定数のようになります。あなたが贅沢を禁止する制約を受けていない限り、グローバル、またはローカライズされた定数をインデックスで参照することについての何かは、私にとって悪い習慣のようです。
ThorSummoner 2014

2
タプルは、動的に定義された構造体のような複数の要素を格納できるデータ型です。したがって、OPが必要とするタイプの3つの変数が格納されます。それは彼が欲しかったコンテンツに対する制限を提供するのに役立ちません。
gbjbaanb 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.