Αναδρομικός αλγόριθμος για συνενώνονται / κατάρρευση λίστα των ημερομηνιών σε σειρές

ψήφοι
1

Λαμβάνοντας υπόψη τον κατάλογο των ημερομηνιών

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

Ψάχνω για τους δείκτες προς ένα αλγόριθμο αναδρομική ψευδοκώδικα (το οποίο μπορεί να μεταφραστεί σε μια προσαρμοσμένη συνάρτηση FileMaker) για την παραγωγή ενός καταλόγου των περιοχών, δηλαδή

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

Ο κατάλογος είναι presorted και τα διπλότυπα. Έχω δοκιμάσει ξεκινώντας τόσο από την πρώτη τιμή και προς τα εμπρός εργασίας, και την τελευταία τιμή και εργάζονται προς τα πίσω, αλλά εγώ απλά δεν φαίνεται να μπορεί να το πάρει για να λειτουργήσει. Έχοντας ένα από αυτά τα ματαιώνοντας τις μέρες ... Θα ήταν ωραίο αν η υπογραφή ήταν κάτι σαν

CollapseDateList( dateList, separator, ellipsis )

:-)

Δημοσιεύθηκε 18/05/2010 στις 13:58
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Η κύρια ρουτίνα θα είναι κάπως έτσι:

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

Υποθέτω έχετε κάποια λειτουργία που σας λέει αν δύο ημερομηνίες είναι συνεχόμενες ή όχι.

Απαντήθηκε 18/05/2010 στις 15:09
πηγή χρήστη

ψήφοι
1

Εδώ είναι η αναδρομική κωδικό FileMaker, η οποία κάνει τη δουλειά του. Η βασική προσέγγιση είναι να κάνουμε την αντικατάσταση στη θέση του, εφόσον είναι αναγκαίο υπολογισμό της ημερομηνίας από την τελευταία ημερομηνία (δεξιά περισσότεροι λέξη) σε μια τιμή. Με αυτόν τον τρόπο μπορεί να αποφασίσει για το πότε για να ελέγξετε αν η επόμενη τιμή εξακολουθεί να είναι μέρος της πρώτης σειράς, ή σηματοδοτούν την πρώτη σειρά, όπως κάνει και να επικεντρωθεί σε σχετικά με τις υπόλοιπες τιμές. Η ελπίδα αυτό βοηθά κάποιον άλλο.

// 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 )
      ) 
    )
  )
)
Απαντήθηκε 18/05/2010 στις 16:26
πηγή χρήστη

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