2012-12-23 12 views
17

एक स्कैला सूची के लिए [Int] मैं अधिकतम तत्व मान खोजने के लिए अधिकतम विधि को कॉल कर सकता हूं।स्कैला में सूची में अधिकतम मूल्य का सूचकांक कैसे प्राप्त कर सकता हूं?

मैं अधिकतम तत्व की अनुक्रमणिका कैसे प्राप्त कर सकता हूं? इसके सूचकांक के साथ इस सूची को ज़िप, सबसे बड़ा पहला तत्व के साथ जिसके परिणामस्वरूप जोड़ी मिल जाए, और उस का दूसरा तत्व वापस जाने के लिए है

val max = list.max 
val index = list.indexOf(max) 
+0

एक अजीब उपयोग के मामले की तरह लगता है। शायद एक क्रमबद्ध डेटा संरचना की आवश्यकता का उपयोग करें? – andyczerwonka

+0

हां आपके पास अजीब उपयोग के मामले के बारे में एक बिंदु है, आप कह सकते हैं कि यह "कोड गंध" है क्योंकि अधिकतम स्थान को सूची बनाते समय अधिकतम पाया जा सकता था। इस छोटी सी जगह में यह गलत क्यों लगता है में जाने के लिए पर्याप्त जगह नहीं है, शायद मैं बाद में जवाब अपडेट कर दूंगा। – Phil

उत्तर

34

एक तरह से यह करने के लिए:

यह वही अब मैं कर रहा हूँ है जोड़ी:

scala> List(0, 43, 1, 34, 10).zipWithIndex.maxBy(_._1)._2 
res0: Int = 1 

यह समस्या को हल करने का सबसे प्रभावी तरीका नहीं है, लेकिन यह मूर्खतापूर्ण और स्पष्ट है।

+0

अरे, मैं जो कहने वाला था ... मैंने एक केस 'x.zipWithIndex.maxBy {case (i, v) => v} ._ 2' –

1

भी पढ़ने के लिए होगा आसान:

val g = List(0, 43, 1, 34, 10) 
    val g_index=g.indexOf(g.max) 
0

दलाल मेरे पुस्तकालय! :)

class AwesomeList(list: List[Int]) { 
    def getMaxIndex: Int = { 
    val max = list.max 
    list.indexOf(max) 
    } 
} 

implicit def makeAwesomeList(xs: List[Int]) = new AwesomeList(xs) 
               //> makeAwesomeList: (xs: List[Int])scalaconsole.scratchie1.AwesomeList 

//Now we can do this: 
List(4,2,7,1,5,6) getMaxIndex    //> res0: Int = 2 

//And also this: 
val myList = List(4,2,7,1,5,6)   //> myList : List[Int] = List(4, 2, 7, 1, 5, 6) 
myList getMaxIndex      //> res1: Int = 2 

//Regular list methods also work 
myList filter (_%2==0)     //> res2: List[Int] = List(4, 2, 6) 

अधिक इस पैटर्न यहाँ के बारे में विवरण: http://www.artima.com/weblogs/viewpost.jsp?thread=179766

+0

लिखना आसान है, है ना? सूची के माध्यम से दो बार जाओ? –

+0

हाँ आप सही हैं। मेरे पास सूची के माध्यम से एक पुनरावृत्ति में अधिकतम प्राप्त करने का एक तरीका है, लेकिन मुझे लगता है कि पठनीयता उस के साथ एक बड़ी हिट लेती है। इसके अलावा, इसमें विशेष आइटम लाने के लिए myList (अनुक्रमणिका) का उपयोग करना शामिल है और मुझे यकीन नहीं है कि –

1
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 

मामले में एक से अधिक अधिकतम हैं, यह पहले एक के सूचकांक देता है।

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

विपक्ष: शायद आप अपवाद पसंद करते हैं :) एक लाइनर नहीं।

+0

हाय कितना कुशल है, मैं <% और <: ऑपरेटरों के अर्थ के बारे में कहां पढ़ सकता हूं, Google पर खोज करना मुश्किल है (या कहीं भी) ऑपरेटरों के लिए जो शब्द नहीं हैं। साथ ही, मुझे लगता है कि आप अपने उत्तर में tailrec का उपयोग कर सकते हैं ([उदाहरण] (https://gist.github.com/trylks/6164315))। धन्यवाद। – Trylks

+0

[मिला!] (Http://ofps.oreilly.com/titles/9780596155957/ScalasTypeSystem.html) पूछने के लिए खेद है। – Trylks

4

Seq के बाद से स्काला में एक समारोह है, निम्नलिखित कोड काम करता है:

list.indices.maxBy(list) 
संबंधित मुद्दे

 संबंधित मुद्दे