मैं अपने कंप्यूटर विज्ञान पाठ्यक्रम के लिए एक असाइनमेंट पर काम कर रहा हूं जिसके लिए मुझे एक तुलनात्मक इंटरफ़ेस लागू करने की आवश्यकता है।

हमने इंटरफ़ेस पर किसी भी प्रकार की लंबाई पर चर्चा नहीं की है, केवल यह बताया जा रहा है कि यह दो वस्तुओं की तुलना करता है और इससे कम, अधिक और बराबर देता है, लेकिन सचमुच यह इसके बारे में है, जो निराशाजनक है।

मैं इस पर और अधिक शोध करने का इरादा रखता हूं, लेकिन अभी के लिए मुझे लग रहा है कि मैं इस उलझन में हूं कि मेरा तुलना () पद्धति का कार्यान्वयन क्यों काम नहीं कर रहा है।

ग्रहण मुझे एक त्रुटि दे रहा है कि तुलना करने के लिए() को एक int वापस करना होगा, लेकिन यदि आप ध्यान दें, तो मैं एक पूर्णांक मान लौटा रहा हूं। तो क्या मुद्दा हो सकता है?

public int compareTo(Task taskToCompare) {
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            return 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            return -1;
        }
        else if(this.priority > taskToCompare.getPriority()) {
            return 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        return -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        return 1;
    }
}
2
GainzNerd 13 मार्च 2020, 00:35
क्या होगा जब this.complete == false && taskToCompare.isComplete() == false
 – 
Nonika
13 मार्च 2020, 00:47
1
डिफ़ॉल्ट मामले में कोई वापसी नहीं है (यदि बयानों में गिरावट आती है)।
 – 
NomadMaker
13 मार्च 2020, 01:16

4 जवाब

यदि वापसी का प्रकार int है, तो आपको एक int या throw एक अपवाद वापस करना होगा। बिना return के विधि से बाहर निकलने से कंपाइलर त्रुटि हो जाएगी।

यदि आपके पास if-else-if शर्त है, तो ऐसा मामला हो सकता है जहां कोई भी ब्लॉक नहीं कहा जाता है। इसलिए आपको return के साथ एक else स्टेटमेंट बनाना चाहिए।

साथ ही, यदि आप विधि को कई बार कॉल करते हैं, तो isComplete() और taskToCompare.getPriority() का परिणाम बदल सकता है। संकलक नहीं जानता कि आपका तर्क इसे रोकता है या नहीं।

उदाहरण के लिए, यह मामला है यदि complete, false है और isComplete() भी false लौटाता है। पहले की तरह, कंपाइलर नहीं जानता कि आपका तर्क इसे रोकता है या नहीं।

मुझे लगता है कि आप कुछ ऐसा चाहते हैं:

public int compareTo(Task taskToCompare) {
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            return 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            return -1;
        }
        else{
            return 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        return -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        return 1;
    }else{
        return 0;
    }
}
9
dan1st 13 मार्च 2020, 00:49
ओह, मैं देखता हूं। धन्यवाद। क्या this.complete && taskToCompare.isComplete() को इस बात का ध्यान नहीं रखना चाहिए कि दोनों कार्य पूर्ण हैं या नहीं?
 – 
GainzNerd
13 मार्च 2020, 00:55
नहीं, यदि कार्यों में से कोई एक अधूरा है, तो वह इसकी परवाह नहीं करता है। यदि कोई कार्य पूरा नहीं होता है, तो न तो if और न ही else-if ब्लॉक को लागू किया जाएगा। साथ ही, isComplete() विधि अलग-अलग परिणाम दे सकती है यदि यह उदा। इसके बीच किसी अन्य थ्रेड द्वारा संशोधित if और else if में निष्पादित किया जाता है।
 – 
dan1st
13 मार्च 2020, 00:59
मैंने इसे लागू करने की कोशिश की: (this.complete == true && taskToCompare.isComplete() == true) || (this.complete == false && taskToCompare.isComplete() == false) विल (यह। पूर्ण == असत्य और& कार्य ToCompare.isComplete () == असत्य) सत्य पर लागू नहीं होगा?
 – 
GainzNerd
13 मार्च 2020, 02:01
साथ ही, फिर से, मदद करने के लिए और आपके समय के लिए धन्यवाद। बहुत सराहना की।
 – 
GainzNerd
13 मार्च 2020, 02:30

क्या होगा अगर this.complete == false और taskToCompare.isComplete() == false?

संकलक शिकायत कर रहा है क्योंकि आपने हर मामले को कवर नहीं किया है।

4
Michael 13 मार्च 2020, 00:45
समझ गया। आपके इनपुट और इसे स्पष्ट करने के लिए बहुत-बहुत धन्यवाद।
 – 
GainzNerd
13 मार्च 2020, 00:55

आपके विधि हस्ताक्षर के अनुसार, आपको एक int मान वापस करना होगा। ऐसी स्थिति हो सकती है जब आपके कोड में उल्लिखित शर्तों में से कोई भी true का मूल्यांकन नहीं करता है और उस स्थिति में, आपकी विधि कुछ भी वापस नहीं करेगी जो विधि के हस्ताक्षर के विरुद्ध है।

इसे करने का एक आसान तरीका है कि एक वैरिएबल को रिटर्न वैल्यू असाइन करें और वेरिएबल को मेथड से बाहर निकलने से ठीक पहले वापस कर दें। आप इसे इस प्रकार कर सकते हैं:

public int compareTo(Task taskToCompare) {
    int value = 0;
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            value = 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            value = -1;
        }
        else if(this.priority > taskToCompare.getPriority()) {
            value = 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        value = -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        value = 1;
    }
    return value;
}
0
Arvind Kumar Avinash 13 मार्च 2020, 00:47

अधिक कॉम्पैक्ट संस्करण:

public int compareTo(Task taskToCompare) {
        int completeCompare = (this.complete == taskToCompare.complete) ? 0 : (this.complete  ? 1 : -1);
        if(completeCompare==0) {
            return  this.priority-taskToCompare.getPriority();
        }
        return completeCompare;
    }
1
Nonika 13 मार्च 2020, 00:51