Üçlü veya üç durumlu bir değişkeni depolamak için en iyi veri türü


13

Feragatname: Veri tiplerinin hangi betik / programlama dilini kullandığınız konusunda biraz öznel olduğunu biliyorum, tercih olarak Python'a yazmayı seviyorum; Yine de herhangi bir dil / uygulama hakkında duymak mutluyum.

Üç durumlu bir değişkeni depolamak için en iyi veri türü nedir? Pozitif, Nötr ve Negatif olan veya temsil eden bir şey.

Örnek: Tamsayılar -1, 0, 1.

  • Pro: Çok özlü.
  • Pro: Potansiyel olarak verimli, Tek bir 2 bit işaretli tam sayı olarak saklanabilir.
  • Pro: kayan nokta çarpanı gibi bir ölçek olarak kullanılabilir.

Örnek 2: 0, null, 1(ya da herhangi bir permütasyon)

  • Pro: Nötr olmayan kullanım durumu ikili olabilir.
  • Con: Dinamik veri türü gerektirir
  • Con: Potansiyel olarak kısa değil.

Örnek 3: +, (boş dize),-

  • Pro: Çok özlü.
  • Con: Durumu belirlemek için dize mantığını kullanabilir.
  • Pro ?: Sezgisel grafik gösterim.

Belki de hayal bile edemediğim zekice bir şey yapabilen bazı akıllı ikili mantık vardır, belki de kullanım durumunun çok fazla dikkate alınması gerekir.

Ayrıca, üçlü bir durumu bir veritabanı motorunda saklamak için uyarlarken dikkat edilmesi gereken noktalar var mı? Referans için Innodb gibi.


12
Numaralandırma : python , java , C # , C , C ++ , git ...

Ibidem, ama birçok dilde, numaralandırılmış türlerin, onları başka bir türe sokmaya çalışmaktan çok daha fazla güvenlik sağladığını ekliyorum.
Blrfl

4
Bu soru büyük ölçüde kullanım senaryosuna bağlıdır. Genel olarak, listelenen uygulama seçeneklerinin tümü, farklı zamanlarda, bazı farklı amaçlar için uygun görünmektedir.
rwong

2
.NET'te boş değerli bir boole kullanabilirsiniz. Çoğu veritabanı, boş bir durumla bir boole (veya genellikle adlandırıldığı gibi bir bit) depolamanıza izin verir. Depolama için bir karakter de kullanabilirsiniz. Karakter, daha sonra depolama mekanizmasını değiştirmek zorunda kalmadan daha fazla alana izin verecektir.
Adam Zuckerman

1
Boole için bir işaretçi de kullanılabilir. Bool 0 ve 1'e zorlanır ve işaretçi NULL ise üçüncü duruma sahip olursunuz. Tabii ki dil bağlıdır.
Devolus

Yanıtlar:


7

Bunu ifade etmenin en açık ve net yolu olan bir enumun yanı sıra, dile özgü bir enumun ifade edilemediği birlikte çalışabilir sistem için kullanılan sistem -1/0/1 seçeneğidir.

Yine de bir bit maskesi denemek isteyebilirsiniz, burada 0 0, 1 'bit 2 seti' ve 2 'bit 3 seti' anlamına gelir (yani, açık veya kapalı olabilen 3 bitiniz vardır. 3 veya bit 1 ve 2 seti, o zaman iyisiniz.Bu seçenek, gelecekte 4, 8, 16 vb. Sonraki bitleri ayarlar olarak 4 veya daha fazla bayrağa ihtiyacınız olabileceğini düşünüyorsanız en iyisidir.

Tüm bunlar tek bir 8 bit veri tipine sığar, böylece bellek boşa gitmez veya dönüşüm gerektirmez (karakter tabanlı bir sistemde bazen platformunuza bağlı olarak bazen 16 bit karakter kullanılır, bazen 8 bit kullanılır).

Hiçbir durumda boş düşünmezdim. Belki bir veritabanında, ancak sadece sistemin NULL'ler için farklı bir desteğe sahip olduğunu garanti edebileceğim ve hatta o zaman bile birisi açıkça ayrım yapmadıysa ve gerçekten boş olduğunda 0 ile sonuçlandığında hataya eğilimli olabilir.


Burada en iyi cevap IMO. NULL, DB'ye eklenmemiş olabilir, durumunun -1,0,1'e sahip 'NULL' olması ve muhtemelen NULL - null, alanın hiçbir zaman doldurulmadığını belirgin olarak gösterir!
Ken

3

Bu soruya doğrudan net bir cevap yazmak niyetinde değilim; yukarıda övgüde bulunduğum gibi, bu soru büyük ölçüde kullanım senaryosuna bağlıdır. Genel olarak, listelenen uygulama seçeneklerinin tümü, farklı zamanlarda, bazı farklı amaçlar için uygun görünmektedir.

Ancak, dikkatinizi bu temel ilkelere ve arka plan bilgilerine çekmek istiyorum, böylece kendi bilinçli kararınızı verebilirsiniz.


Daha hafif bir notta, şu şakayı da okuyun: "Bir işadamı muhasebeciye sorar; iki artı iki nedir?"

Tüm muhasebeciler ve muhasebeciler için özür dileriz. Bu şakadan bahsetmem, çok yakında tanımlayacağımız bir şeyin özgürlüğünü ve müteakip sorumluluk ve sonuçlarını (hem mantıklı bir şekilde) vurgulamayı amaçlıyor .


Soru: Üç değerli bir mantığın doğruluk tablosu nedir?

Cevap:

... sandalyesinden kalktı, kapıya gitti, kapattı, geri döndü ve oturdu. Masaya yaslanmış,

... ve bir kağıt üzerine çizilmiş bir grafik çıkarır.

Operasyon: Mantıksal ve - Gizli - 2014 3. Çeyrek için Taslak

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

... O "bir alçak sesle ne kadar o sihirli değerleri ne olabilir olmasını istiyorsunuz?"

Bir grafik tasarımcı bir programcıya, "Üç değerli mantığa örnek verebilir misiniz?"

Programcı, "Bana olabildiğince siyah beyaz olan iki renk verebilir misiniz?"

Grafik tasarımcı: "yani ... siyah beyaz mı?"

Programcı: "Kesinlikle. Şimdi üçüncü bir renk vereceğim - ama bunu bir ARGB numarası olarak belirtmem gerek. Umarım umursamazsın."

Grafik tasarımcı: "ARGB ile her gün çalışıyorum ..."

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Remark. Yukarıda, Siyah ve Beyaz tamamen opak renklerdir. Üçüncü renk olan Hiçbir Şey tamamen şeffaf değildir. Çeşitli oranlarda karıştırıldığında, Siyah ve Beyaz çeşitli griler haline gelir, ancak Hiçbir Şey'de karıştırmak hiçbir şeyi değiştirmez.


Bir doğruluk tablosunun kullanımı ile oldukça ilgileniyorum, Tekrar kendi sorularımın arkasındaki anlamı açıyorum.
ThorSummoner

1

Üç olası durumun doğal bir anlamı varsa, bu doğal anlama uygun bir şey kullanın. Örneğin, olası durumlar 1, 2 veya 3'tür veya 100, 200 ve 300 ise bir tamsayı kullanın. Olası durumlar evet, hayır veya bilinmiyorsa, boole nesnesine isteğe bağlı bir boolean veya işaretçi kullanabilirsiniz; hiçbir değere, "evet" değerine veya "hayır" değerine sahip olma olasılığı vardır. Bazı insanlar hoşlanmasa da.

Tamsayıların olası durumlar olarak nasıl yorumlanabileceğinin açık bir yolu varsa, tamsayı kullanabilirsiniz. "Daha az", "eşit", "daha büyük" durumlarının -1, 0 ve +1 kullanabileceğini gösteren bir karşılaştırma işlevini varsayalım. Her ne kadar bazı insanlar belirgin bulduğunuzu açık bulamayabilir.

Harflerin olası durumlar olarak nasıl yorumlanabileceğinin açık bir yolu varsa, bir karakter kullanabilirsiniz. Örneğin, eyaletleriniz "kırmızı", "yeşil" veya "mavi" ise, 'r', 'g' ve 'b' harflerini kullanabilirsiniz. Yine, size açık olan şey ...

Numaralandırılmış tip her zaman bir olasılıktır. Bir dize her zaman bir olasılıktır, ancak çoğu dilde tür denetimini kaybedersiniz.

Bazı insanlar "durum 1'de", "durum 2'de", "durum 3'te" temsil etmek için üç boole değeri kullanır.

Ne yaparsanız yapın, açık ve anlaşılır bir şey kullanmaya çalışarak yönlendirilmelisiniz, aniden dört durumunuz varsa sizi rahatsız etmiyor ve derleyicinin olabildiğince hatalar bulalım.


0

Üç durumlu bir değişkeni depolamak için en iyi veri türü nedir? Pozitif, Nötr ve Negatif olan veya temsil eden bir şey.

Bu büyük ölçüde dile, ne yaptığınıza, soyutlama düzeyine (bu aynı zamanda dile ve benzerlerine de bağlıdır) bağlıdır.

Esas olarak C ++ kullanıyorum ve burada birçok seçenek var. En basit olanı enum tribool_state { false_val, true_val, undetermined_val }. Kullanım senaryosunuz bu tür bir değer döndüren tek bir işlevse bu yeterli olacaktır.

Muhtemelen boost::optional<bool>elde etmek imkansız bir boole sonucunu ifade etmek istersem kullanırım (örneğin, alınan ağ verilerinin tamamlanıp tamamlanmadığını kontrol edin, bu durumda boolean değerini işleyin).

Ben kullanırım boost::triboolben tam üç-durumlu boole mantığı desteklenen bir bulanık boolean bir sonuç (örn ifade etmek istiyorsa true || indetermined -> true, false && indetermined -> false, true && indetermined -> indeterminedvb).

Benzer şekilde, python'da, bir sabitler kümesi veya bir sınıf (yine, istemci kodunda ne tür anlambilim / işlemlere bağlı olarak) kullanırım:

Örneğin, ben kullanacağım:

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

üç sonuçtan birini döndüren basit bir işlev olsaydı.

Bunun yerine üç durumlu boole mantığı gerektiren tam bir kitaplığım olsaydı, değer türünü sınıf olarak uygulardım.


0

Java kullanıyorsanız, bir Boolean nesnesi kullanabilirsiniz: bir nesne olduğundan ve bir boolean içerdiğinden, true, false ve null değerlerini tutabilir. Ama bunun en iyi yolu olup olmadığından emin değilim.


-6

Microsoft.NET'te, gereksiniminiz için kullanılabilecek bir "Tuple" türü vardır. Http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx adresini ziyaret edin.


Bu sayfa başına: Bir demet, belirli bir sayı ve eleman dizisine sahip bir veri yapısıdır. Bir tuple örneği, bir kişinin adı gibi bir tanımlayıcıyı ilk öğede, ikinci öğede bir yıl ve kişinin geliri gibi bir tanımlayıcıyı depolamak için kullanılan üç öğeli (3-tuple veya üçlü olarak bilinen) bir veri yapısıdır. o yıl için üçüncü unsurda. .NET Framework, bir ila yedi öğeli tuplesleri doğrudan destekler. Ayrıca, Tuple <T1, T2, T3, T4, T5, T6, T7, TRest> nesnesinin Rest özelliğinde tuple nesnelerini iç içe geçirerek sekiz veya daha fazla öğeden oluşan tuples oluşturabilirsiniz.
Adam Zuckerman

1
Bu, bir demetin herhangi bir türü sekizlide (8 boyut) saklayabileceğini söylüyor.
Adam Zuckerman


Benim tercih ettiğim Python, yine de bana biraz okuma öneren bir dizi veri tipi içeriyor ve bu da üçlülerin üçlü veriler için uygun olduğunu gösteriyor. Veya potansiyel olarak bir tuple endeksinin değeri, kullanım senaryosu için saklanacak veriler ve tuple daha çok bir sabit gibi olacaktır. Lüksleri yasaklayan kısıtlamalar altında olmadığınız sürece, küresel, hatta yerel sabitleri endekse göre göndermeyle ilgili bir şey bana zayıf bir uygulama gibi görünüyor.
ThorSummoner

2
Bir grup, yalnızca dinamik olarak tanımlanan bir yapı gibi birçok öğeyi depolayabilen bir veri türüdür. Bu yüzden OP'nin istediği tipte 3 değişken depolardı. İstediği içerik üzerindeki kısıtlamayı sağlamaz.
gbjbaanb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.