जावा में बूलियन चर को टॉगल करने का सबसे साफ तरीका?


211

क्या जावा में एक बूलियन को नकारने का एक बेहतर तरीका है यदि एक साधारण इफ-बाकी की तुलना में?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

ओह अच्छा, मैं एक ही सवाल पूछने वाला था, हालांकि मेरा सवाल जावास्क्रिप्ट / as3, या ECMAScript के लिए विशिष्ट था, जिसे मैं सामान्य रूप से मानता हूं ... जो इस प्रश्न को आसानी से कवर कर देगा।
मैट लोहकैंप

अगर नहीं है तो क्या है! ऑपरेटर ??
onmyway133

जवाबों:


537
theBoolean = !theBoolean;

16
यह वास्तव में स्पष्ट है - उफ़! पता नहीं क्यों मैं इसके बारे में नहीं सोचा था। धन्यवाद।
केविन ग्रिफिन

बूलियन एक प्राकृतिक पसंद की तरह लगता है - शायद भविष्य में।
मैट लोहकैंप


12
@ ChristofferHammarström उस तर्क से, तब --integer == - (- (पूर्णांक)) == पूर्णांक नहीं होना चाहिए?
user515655

1
@ user515655 - भाषा एक --ऑपरेटर (वास्तव में, उनमें से दो, दो ++ऑपरेटरों के साथ ) को परिभाषित करती है, लेकिन एक !!ऑपरेटर को परिभाषित नहीं करती है । यदि आप चाहें -(-(integer))तो दोनों -वर्णों के बीच सफेद स्थान का उपयोग कर सकते हैं । लेकिन सफेद जगह की परवाह किए बिना !!दो !ऑपरेटरों के रूप में पर्स ।
टेड हॉप

164
theBoolean ^= true;

यदि आपका चर चार अक्षरों से अधिक लंबा है तो कम कीस्ट्रोक्स

संपादित करें : जब Google खोज शब्दों के रूप में उपयोग किया जाता है तो कोड उपयोगी परिणाम देता है। उपरोक्त कोड नहीं है। उन लोगों के लिए जिन्हें इसकी आवश्यकता है, यह यहाँ वर्णित के रूप में बिटवार XOR है


14
और यह DRY के अनुरूप है :)
Tetha

6
अल्पता बुद्धि की आत्मा है।
पॉल ब्रिंकले

7
अब मुझे अपने प्रोग्रामर दोस्तों के सामने कूल दिखने के लिए ऑफहैंडली नेम-ड्रॉप (सिंटेक्स-ड्रॉप?) XOR मिल जाता है। आपका उत्तर चुने हुए एक के साथ विलय कर दिया जाना चाहिए, साथ में वे शुद्ध पूर्णता हैं।
मैट लोहकैंप

6
@ScottStanchfield ऐसे लोगों को इसे सीखना चाहिए। यह बिल्कुल भी मुश्किल नहीं है, यह कोई हैक नहीं है, और इसे नहीं जानना अक्सर भद्दा कोड होता है जैसे कि यह एक प्रश्न। यह एक वास्तविक झटका है - मानक सम्मेलनों का उपयोग करते हुए पांच लाइनें!
Maaartinus

4
यह ऑपरेशन भी अन्य संस्करणों की तुलना में 12% अधिक तेज है theBoolean = !theBoolean;याtheBoolean = theBoolean ? false : true;
ब्लेन कास्टेन

32

वहाँ कई हैं

"स्पष्ट" तरीका (अधिकांश लोगों के लिए)

theBoolean = !theBoolean;

"सबसे छोटा रास्ता" (ज्यादातर समय)

theBoolean ^= true;

"सबसे दृश्य" तरीका (सबसे अनिश्चित रूप से)

theBoolean = theBoolean ? false : true;

अतिरिक्त: एक विधि कॉल में टॉगल और उपयोग करें

theMethod( theBoolean ^= true );

चूंकि असाइनमेंट ऑपरेटर हमेशा वही देता है जो असाइन किया गया है, यह बिटवाइज़ ऑपरेटर के माध्यम से वैल्यू को टॉगल करता है, और फिर मेथड कॉल में उपयोग किए जाने वाले नए असाइन किए गए मान को वापस करता है।


एक फ़ंक्शन / पद्धति में कार्यान्वयन को लपेटें जिसे टॉगल कहा जाता है और फिर इसे भ्रमित करने का कोई तरीका नहीं है।
लैम्ब्ज

@ राइनर: Cनिश्चित रूप से, लेकिन Javaइसमें बूलियन और पूर्णांक को मिलाने की अनुमति नहीं है ( while(1)जावा में ऐसी चीजें संभव नहीं हैं)।
लेवी

@ लेम्बेज: सच है, लेकिन नकारात्मक पक्ष पर आप बस इसे पारित करके एक बूलियन को टॉगल नहीं कर सकते, क्योंकि यह संभव नहीं है कि जावा में संदर्भ द्वारा प्राइमिटिव को पारित किया जाए। आपको अपने चर के लिए विधि के परिणाम को फिर से असाइन करना होगा, या अन्यथा बूलियन के लिए एक आवरण वर्ग बनाना होगा।
लेवी

उपरोक्त "स्पष्ट तरीका" सोनार द्वारा चिह्नित किया जाता है - इनर असाइनमेंट से बचा जाना चाहिए।
Orby

2

यदि आप बूलियन NULL मान का उपयोग करते हैं और उन्हें गलत मानते हैं, तो यह प्रयास करें:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

यदि आप बूलियन NULL मान नहीं सौंप रहे हैं, तो यह प्रयास करें:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

ये सबसे साफ हैं क्योंकि वे विधि हस्ताक्षर में इरादा दिखाते हैं, की तुलना में पढ़ना आसान है ! ऑपरेटर, और आसानी से डिबग किया जा सकता है।

प्रयोग

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

बेशक, यदि आप ग्रोवी या एक भाषा का उपयोग करते हैं जो विस्तार विधियों की अनुमति देता है, तो आप एक एक्सटेंशन रजिस्टर कर सकते हैं और बस कर सकते हैं:

Boolean b = false
b = b.toggle() // == true

अच्छा दृष्टिकोण, लेकिन पूरी तरह से अस्पष्ट (इम्हो) नहीं। "टॉगल (..)" का उपयोग करने / पढ़ने वाले किसी व्यक्ति के लिए, पहले से ही अंतर्निहित चर को टॉगल करने के लिए विधि को कॉल करना (इसे फिर से चर पर असाइन किए बिना) हो सकता है। कोड देखना अभी हमारे लिए स्पष्ट है, लेकिन वास्तविक जीवन में डिबग करना काफी कठिन हो सकता है। एक बेहतर विधि का नाम "विपरीत" या संभवतः "निषेध" हो सकता है, जिससे यह कुछ हद तक स्पष्ट हो सके; या एक वस्तु के साथ पहले दृष्टिकोण का उपयोग करें Booleanऔर वास्तव में विधि के भीतर टॉगल करें (लेकिन अभी भी कुछ अस्पष्ट)।
लेविट

2

"जावा इनवर्ट बूलियन फंक्शन" की खोज करते समय यह उत्तर आया। नीचे दिए गए उदाहरण कुछ स्थिर विश्लेषण उपकरणों को ब्रांचिंग तर्क के कारण विफल होने से रोकेंगे। यह उपयोगी है यदि आपको एक बूलियन को पलटना चाहिए और व्यापक इकाई परीक्षणों का निर्माण नहीं किया है;)

Boolean.valueOf(aBool).equals(false)

या वैकल्पिक रूप से:

Boolean.FALSE.equals(aBool)

या

Boolean.FALSE::equals

1
मैं इस तथ्य को पसंद करता हूं कि आप Boolean.FALSE::equalsथोड़ा सा लंबोदा लिखने के बजाय एक मैपिंग फ़ंक्शन को पारित कर सकते हैं
पैट्रिक पार्कर

0

यदि आप कुछ विशेष रूप से पेशेवर नहीं कर रहे हैं, तो आप हमेशा एक Util वर्ग का उपयोग कर सकते हैं। पूर्व, एक वर्ग के लिए एक परियोजना से एक उपयोग वर्ग।

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

तो बस एक Util ऑब्जेक्ट बनाएँ Util u = new Util(); और वापसी के लिए कुछ हैSystem.out.println( u.flip(bool) );

यदि आप एक ही चीज़ का बार-बार उपयोग करने वाले हैं, तो एक विधि का उपयोग करें, और विशेष रूप से यदि यह परियोजनाओं के पार है, तो एक Util class बनाएं। Dunno उद्योग मानक क्या है। (अनुभवी प्रोग्रामर मुझे सही करने के लिए स्वतंत्र महसूस करते हैं)



-4

इससे पहले:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

उपरांत:

boolean result = isresult();
result ^= true;

किसने कभी मतदान किया है? क्या आप कृपया कारण भी बता सकते हैं?
निखिल कुमार

11
दो मुख्य कारण मैं सोच सकता हूं कि किसी ने आपको क्यों उतारा हो सकता है: 1) थ्रेड नेक्रोमेंसी ( आओ! प्रश्न 7 साल पहले पूछा गया था! ) और आपका जवाब तालिका में कुछ नया नहीं लाता है। 2) मतदाता को कुछ "क्लीनर" की उम्मीद थी ( पढ़ें: कम ) - आरोनोमेनपा का जवाब इसका एक प्रमुख उदाहरण है।
प्रिएदु नीमरे

5
@ ईल्ट्ज़: इसके विपरीत - मैंने वास्तव में उसे उखाड़ फेंका, क्योंकि उत्तर तकनीकी रूप से सही था। हालाँकि, मुझे कहना होगा कि मुझे सस्ते कर्म के लिए पिछले उपयोगकर्ता के उत्तरों को बूट करने की प्रवृत्ति का आनंद नहीं है (देखें nlaq का उत्तर)।
प्रियादु नीमरे

@PriiduNeemre, 7+ साल से पहले स्वीकार किए गए सवाल और जवाब और क्या आपको लगता है कि आपको छोड़कर कोई भी व्यक्ति अपवोट करेगा? इसके अलावा आपका उत्तर भी निशान तक नहीं है .. :(
user1140237

2
के बाद: बूलियन परिणाम =! isresult ();
पीटर फ्रबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.