Recursieve algoritme voor het samenvoegen / instorten lijst van data in bereiken

stemmen
1

Gegeven een lijst van data

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

Ik ben op zoek naar aanwijzingen in de richting van een recursieve pseudocode algoritme (die ik kan vertalen in een FileMaker aangepaste functie) voor het produceren van een lijst van bereiken, dat wil zeggen

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

De lijst wordt voorgesorteerd en gededupliceerd. Ik heb geprobeerd uitgaande van zowel de eerste waarde en het werken naar voren, en de laatste waarde en naar achteren te werken, maar ik kan gewoon niet lijken te krijgen om te werken. Het hebben van één van die frustrerende dagen ... Het zou mooi zijn als de handtekening iets als was

CollapseDateList( dateList, separator, ellipsis )

:-)

De vraag is gesteld op 18/05/2010 om 13:58
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

De belangrijkste routine zou er ongeveer zo uitzien:

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);

Ik neem aan dat u een aantal functie die u vertelt of twee datums zijn opeenvolgende of niet.

antwoordde op 18/05/2010 om 15:09
bron van user

stemmen
1

Hier is het recursieve FileMaker code die het werk doet. De fundamentele aanpak is om de vervanging te doen in de plaats, waar nodig bepalen van de datum van de laatste dag (meest rechtse woord) binnen een waarde. Op die manier kan beslissen wanneer om te controleren of de volgende waarde is nog steeds deel uit van het eerste bereik, of markeer de eerste bereik als gedaan en focus op de rest van de waarden. Hoop dat iemand anders helpt.

// 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 )
      ) 
    )
  )
)
antwoordde op 18/05/2010 om 16:26
bron van user

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