Rekursiv algoritme for fortetting / kollapse liste over datoer i områder

stemmer
1

Gitt en liste med datoer

12/07/2010
13/07/2010
14/07/2010
15/07/2010
12/08/2010
13/08/2010
14/08/2010
15/08/2010
19/08/2010
20/08/2010
21/08/2010

Jeg leter etter pekere mot en rekursiv pseudo algoritme (som jeg kan oversette til en Filemaker definert funksjon) for å produsere en liste over områder, dvs.

12/07/2010 to 15/07/2010, 12/08/2010 to 15/08/2010, 19/08/2010 to 20/08/2010

Listen er presorted og de-duplisert. Jeg har prøvd å starte fra både den første verdien og arbeids fremover, og den siste verdien og jobbe bakover, men jeg bare ikke kan synes å få det til å fungere. Å ha en av de frustrerende dager ... Det ville være fint om signaturen var noe sånt

CollapseDateList( dateList, separator, ellipsis )

:-)

Publisert på 18/05/2010 klokken 12:58
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hovedrutinen vil se omtrent slik ut:

List<String> list  = new ArrayList<String>();

String firstDate   = dateList[0];
String lastDate    = dateList[0];
String currentDate = dateList[0];

for (int i = 1; i < dateList.length(); i++) {
    if (dateDiff(dateList[i], currentDate) == 1) {
        lastDate   = dateList[i];
    } else {
        list.add(firstDate + separator + lastDate);
        firstDate = dateList[i];
        lastDate  = dateList[i];
    }
    currentDate = dateList[i];
}
list.add(firstDate + separator + lastDate);

Jeg antar du har noen funksjon som forteller deg om to datoene er sammenhengende eller ikke.

Svarte 18/05/2010 kl. 14:09
kilden bruker

stemmer
1

Her er den rekursive Filemaker kode som gjør jobben. Den grunnleggende tilnærming er å gjøre den nye på plass, der det er nødvendig å beregne dato fra den siste datoen (høyre mest ord) innen en verdi. På den måten kan bestemme seg for å når du skal sjekke om den neste verdien er fortsatt en del av den første serien, eller merk den første serien som gjøres og fokusere på resten av verdiene. Håper det hjelper noen andre.

// CollapseDateList( dates, comma, dash)

Let(
  countDates = ValueCount ( dates );

  If (
    countDates < 2 ; dates;  // return the dates we've been given...

    Let(
      [ 
        start_date = GetAsDate( LeftWords( GetValue ( dates ; 1 ); 1 ) );
        date_1 = GetAsDate( RightWords( GetValue ( dates ; 1 ); 1 ) );
        date_2 = GetAsDate( GetValue ( dates ; 2 ) );
        date_3 = GetAsDate( GetValue ( dates ; 3 ) );
        dv_1 = GetAsNumber( date_1 );
        dv_2 = GetAsNumber( date_2 );
        dv_3 = GetAsNumber( date_3 );
        twoFollowsOne = (dv_2 = dv_1 + 1);
        threeFollowsTwo = (dv_3 = dv_2 + 1)
      ];

       // compare dates
      Case(
        // only two dates in list
        countDates = 2;
          if (
            twoFollowsOne;
            start_date & dash & date_2;
            GetValue ( dates ; 1 ) & comma & date_2
          );

        // first three values are sequential
        threeFollowsTwo and twoFollowsOne; 
          CollapseDateList( start_date & dash & date_3 & ¶ & RightValues( dates; countDates - 3 ); comma; dash );

        // first two values are sequential only
        not threeFollowsTwo and twoFollowsOne; 
          start_date & dash & date_2 & comma & CollapseDateList(  RightValues(  dates; countDates - 2 ); comma; dash );

        // first two values are not sequential 
        // default
        GetValue ( dates ; 1 ) & comma & CollapseDateList( RightValues( dates; countDates - 1 ); comma; dash )
      ) 
    )
  )
)
Svarte 18/05/2010 kl. 15:26
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more