2017-04-26 4 views
2

Ich habe eine ziemlich große Sammlung, die ich iterieren und herausfinden möchte, ob die Sammlung mehr als eine Instanz einer bestimmten Nummer enthält. Da die Sammlung groß ist, würde ich gerne früher aufbrechen, d. H. Nicht die komplette Liste durchlaufen.Groovy/Scala - Abbrechen Früh während der Iteration mit einem Akkumulator

Ich habe ein schmutziges Stück Code, der dies in einer nicht-funktionalen Programmierung tut. Allerdings kann ich keine funktionierende Programmierung dafür finden (In Groovy oder Scala), da ich 2 Dinge gleichzeitig machen muss.

  1. Accumulate Zustand
  2. Ausfahrt Früh

Das geschehe „Zustand akkumulieren“ kann die „injizieren“ oder „fold“ Methoden in Groovy/Scala verwenden, aber es gibt keine Möglichkeit früh von denen der Austritt aus Methoden. Original groovy code ist unten. Irgendwelche Gedanken?

def collection = [1,2,3,2,4,6,0,65,... 1 million more numbers] 
def n = 2 

boolean foundMoreThanOnce(List<Integer> collection, Integer n) { 
    def foundCount = 0 
    for(Integer i : collection) { 
     if(i == n) { 
      foundCount = foundCount + 1 
     } 

     if(foundCount > 1) { 
      return true 
     } 
    } 
    return false  
} 

print foundMoreThanOnce(collection, n) 

Antwort

1

Eine von vielen möglichen Scala-Lösungen.

def foundMoreThanOnce[A](collection: Seq[A], target: A): Boolean = 
    collection.dropWhile(_ != target).indexOf(target,1) > 0 

Oder eine leichte Variation ...

collection.dropWhile(target.!=).drop(1).contains(target) 

Scannt die Sammlung nur bis zum zweiten Zielelement gefunden wird.

1

Nicht sicher stark, aber wenn möglich, dass Sie Java verwenden 8 dann gibt es eine Möglichkeit

collection.stream().filter(z -> {return z ==2;}).limit(2) 

die Grenze wird sobald die Stromverarbeitung zu stoppen, wie es 2. Auftreten von 2 erhalten.

können Sie es verwenden, wie unten, um sicherzustellen, gibt genau zwei Vorkommen

Long occ = collection.stream().filter(z -> {return z ==2;}).limit(2).count(); 

if(occ == 2) 
    return true; 
Verwandte Themen