2013-10-17 13 views
7

Ich muss eine Funktion in scala, die mir eine Reihe von Daten, gibt mir eine Liste der Bereich. Ich bin relativ neu in Scala und ich bin nicht in der Lage herauszufinden, wie man die richtige 'für' Schleife für die gleiche schreiben. Dies ist, was ich bis jetzt getan habe:Bei einem Bereich, alle Daten in diesem Bereich in Scala erhalten

def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = { 
    var dateArray = [] 
    //for (LocalDate date <- from; !date.isAfter(to); date <- date.plusDays(1)) 
    for(date <- from to until) 
    { 
     dateArray :+ date 
    } 
    return dateArray 
} 

Ich weiß nicht, wie man über den Bereich iteriert.

Antwort

11
val numberOfDays = Days.daysBetween(from, until).getDays() 
for (f<- 0 to numberOfDays) yield from.plusDays(f) 
+0

Ist 'Days' eine Klasse in Scala? –

+1

es ist eine Klasse in Joda-Zeit, die Sie scheinen zu verwenden: http://joda-time.sourceforge.net/apidocs/org/joda/time/Days.html – Ashalynd

4

Versuchen Sie, diese

jedes Datum zu erzeugen, können Sie den Schritt bis 1 Tag wie

val range = dateRange(
<yourstartdate>, 
<yourenddate>, 
Period.days(1)) 
+0

Dies ist eine schlechte Lösung auf Bedürfnisse, da mit Beginn abhängig sein kann = new DateTime (2015, 1, 30, 0, 0), end = neues DateTime (2015, 5, 2, 0, 0), step = Period.months (1) ergibt "2015-01-30", "2015- 02-28 "," 2015-03-28 "," 2015-04-28 ", nicht" 2015-01-30 "," 2015-02-28 "," 2015-03-30 "," 2015-04 -30 " – jbrown

0

einstellen Da Scala ein funktionsfähig ist, gehen mit einer Rekursion:

def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = { 
    if from.compareTo(until) > 1 
     return[] 
    else 
     return from :: calculateDates(from.plusDays(1), until) 
} 
2

Verwenden Sie Lamma Date

$ scala -cp lamma_2.11-1.1.2.jar 
Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import io.lamma.Date 
import io.lamma.Date 

scala> Date(2015, 7, 7) to Date(2015, 7, 10) foreach println 
Date(2015,7,7) 
Date(2015,7,8) 
Date(2015,7,9) 
Date(2015,7,10) 

Diese DateRange wird in einer faulen Art und Weise ausgewertet. Fühlen Sie sich frei, eine Datumsspanne von 5000 Jahren zu konstruieren. :)

9

Wenn Sie den Java 1.8 Datetime-API (oder sein 1,7 Backport threeten) verwenden passieren, dann könnte man schreiben

def between(fromDate: LocalDate, toDate: LocalDate) = { fromDate.toEpochDay.until(toDate.toEpochDay).map(LocalDate.ofEpochDay) }

Verwandte Themen