def maxIndex[ T <% Ordered[T] ] (list : List[T]) : Option[Int] = list match {
case Nil => None
case head::tail => Some(
tail.foldLeft((0, head, 0)){
case ((indexOfMaximum, maximum, index), elem) =>
if(elem > maximum) (index, elem, index + 1)
else (indexOfMaximum, maximum, index + 1)
}._1
)
} //> maxIndex: [T](list: List[T])(implicit evidence$2: T => Ordered[T])Option[Int]
maxIndex(Nil) //> res0: Option[Int] = None
maxIndex(List(1,2,3,4,3)) //> res1: Option[Int] = Some(3)
maxIndex(List("a","x","c","d","e")) //> res2: Option[Int] = Some(1)
maxIndex(Nil).getOrElse(-1) //> res3: Int = -1
maxIndex(List(1,2,3,4,3)).getOrElse(-1) //> res4: Int = 3
maxIndex(List(1,2,2,1)).getOrElse(-1) //> res5: Int = 1
मामले में एक से अधिक अधिकतम हैं, यह पहले एक के सूचकांक देता है।
पेशेवर: आप इसे कई प्रकार के साथ उपयोग कर सकते हैं, यह केवल एक बार सूची के माध्यम से जाता है, आप खाली सूचियों के लिए अपवाद प्राप्त करने के बजाय डिफ़ॉल्ट अनुक्रमणिका की आपूर्ति कर सकते हैं।
विपक्ष: शायद आप अपवाद पसंद करते हैं :) एक लाइनर नहीं।
एक अजीब उपयोग के मामले की तरह लगता है। शायद एक क्रमबद्ध डेटा संरचना की आवश्यकता का उपयोग करें? – andyczerwonka
हां आपके पास अजीब उपयोग के मामले के बारे में एक बिंदु है, आप कह सकते हैं कि यह "कोड गंध" है क्योंकि अधिकतम स्थान को सूची बनाते समय अधिकतम पाया जा सकता था। इस छोटी सी जगह में यह गलत क्यों लगता है में जाने के लिए पर्याप्त जगह नहीं है, शायद मैं बाद में जवाब अपडेट कर दूंगा। – Phil