में तुलनात्मक की सूचियों की तुलना करना मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो तुलनात्मक की दो सूचियों की तुलना करता है। तुलनात्मक रूप से विभिन्न प्रकार के हो सकते हैं जब तक कि दो सूचियों की तुलना में समान पदों के तत्व तुलनीय हैं। उदाहरण:कोटलिन
val list1 = ArrayList<Comparable<*>>()
val list2 = ArrayList<Comparable<*>>()
list1.add(10)
list1.add("xyz")
list1.add('a')
list2.add(10)
list2.add("xyz")
list2.add('b')
println(compare(list1, list2))
यह प्रिंट चाहिए -1 क्योंकि
- 10 == 10
- "xyz" == "xyz"
- 'एक' < 'बी'
और इस प्रकार सूची 1 < सूची 2।
यहाँ कोड है कि मैं एक परीक्षण और त्रुटि प्रक्रिया का एक सा के साथ एक साथ डाल दिया है के बाद से मैं के बारे में कैसे जेनरिक इस विशिष्ट मामले में काम उलझन में एक छोटा सा हूँ:
fun <T> compare(list1: List<Comparable<T>>, list2: List<Comparable<T>>): Int {
for (i in 0..Math.max(list1.size, list2.size) - 1) {
val elem1 = if (i < list1.size) list1[i] else null
val elem2 = if (i < list2.size) list2[i] else null
if (elem1 == null && elem2 == null)
return 0
if (elem1 == null)
return -1
if (elem2 == null)
return 1
@Suppress("UNCHECKED_CAST")
val comparisonResult = elem1.compareTo(elem2 as T)
if (comparisonResult != 0)
return comparisonResult
}
return 0
}
और यह वास्तव में संकलित करता है तथा उम्मीद के अनुसार काम करता है, लेकिन कुछ चीजें हैं जिनके बारे में मैं परेशान हूं।
मेरा पहला प्रयास निम्नलिखित विधि हस्ताक्षर के साथ था:
fun compare(list1: List<Comparable<*>>, list2: List<Comparable<*>>): Int
यह हालांकि संकलन नहीं किया। ऐसा क्यों है? और यह घोषणा दूसरे से अलग कैसे है?
दूसरा, यदि मैं मिलान की स्थिति में अतुलनीय मानों के साथ सूचियों की तुलना करने का प्रयास करता हूं, तो मुझे एक प्रकार का कास्ट त्रुटि मिलती है। उदाहरण के लिए, जब की तुलना [1,1] के लिए [1, "abc"], मैं
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
जाहिरा तौर पर
elem1.compareTo(elem2 as T)
में टाइप कास्ट पर उठता मिल मुझे क्या पहेली: कैसे है टी यहाँ पूर्णांक करने के लिए हल किया? वास्तव में, मुझे हैरान है कि यह वास्तव में संकलित करता है।
और तीसरा, अनचेक कास्ट से छुटकारा पाने का कोई तरीका है? मैंने कोशिश की
if (elem2 !is T)
// throw Exception
लेकिन यह संकलित नहीं हुआ। क्यूं कर? ऐसा लगता है कि किसी भी तरह से यह ज्ञात है कि टी इस पुनरावृत्ति में पूर्णांक होने के लिए है, तो मैं इसके खिलाफ टाइप-चेक क्यों नहीं कर सकता?
विस्तृत स्पष्टीकरण और एक अधिक सुरुचिपूर्ण समाधान के लिए, इल्या, बहुत बहुत धन्यवाद। बहुत उपयोगी! –