الخوارزمية العودية لاستخلاص التواريخ في نطاقات الفحم / الانهيار
-
27-09-2019 - |
سؤال
بالنظر إلى قائمة التواريخ
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
القائمة مقدمة وموزع. لقد حاولت البدء من كل من القيمة الأولى والعمل إلى الأمام ، والقيمة الأخيرة والعمل للخلف ، لكن لا يمكنني أن أجعلها تعمل. وجود أحد تلك الأيام المحبطة ... سيكون من الرائع أن يكون التوقيع شيئًا مثل
CollapseDateList( dateList, separator, ellipsis )
:-)
المحلول
الروتين الرئيسي سيبدو شيئًا كهذا:
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);
أفترض أن لديك بعض الوظائف التي تخبرك إذا كان تاريخان متتاليان أم لا.
نصائح أخرى
إليك رمز صانع 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 )
)
)
)
)