לפעמים כשאנחנו שולפים טקסט מהמסד נתונים אנו מוצאים את עצמינו מתלבטים האם להציג אותו בדף כltr או כrtl.
כמובן, ניתן לבדוק:
אבל כל זה עדיין לא ייתן מענה למחרוזות מעורבות כדוגמת אלו:
- האות הראשונה בא"ב האנגלי היא 'a'.
- 'a' היא האות הראשונה בא"ב האנגלי.
- the first latter of the hebrew abc is 'א'.
- 'א' is the first latter of the hebrew abc.
הפתרון שנראה לי אינטליגנטי יותר, מבוסס על רוב התווים ה"חזקים": אם הרוב הוא עברי אזי המחרוזת נחשבת עברית אם לא – לא. במקרה של תיקו, האלגוריתם יקבע ע"פ האות החזקה הראשונה.
הסיבוכיות של האלגוריתם קטנה מO(n) שכן, הוא מסתיים ברגע שניתן להוכיח רוב תווים לצד זה או אחר, לדוגמה במחרוזת "אבגab" התוים "ab" כלל לא ייבדקו כי גם אם הן לא עבריות המחרוזת כבר מוכחת כעברית.
המתודה:
public static bool IsHebrewString(this string value)
{
int balance = 0;
int firstLetter = 0;
for (int i = 0; i < value.Length; i++)
{
if (char .IsLetter(value[i]))
{
if ((value[i] >= (char )0x5D0) && (value[i] <= (char )0x5EA))
balance++;
else
balance--;
if (firstLetter == 0)
{
firstLetter = balance > 0 ? 1 : -1;
}
}
if ((value.Length - (i + 1)) < Math .Abs(balance))
break ;
}
if (balance == 0)
return firstLetter > 0;
return balance > 0;
}
הנה כמה דוגמאות ליעילות האלגוריתם:
bool test1 = "האות הראשונה בא\"ב האנגלי היא 'a'." .IsHebrewString(); // true
bool test2 = "'a' היא האות הראשונה בא\"ב האנגלי." .IsHebrewString(); // true
bool test3 = "the first latter in hebrew abc is 'א'." .IsHebrewString(); // false
bool test4 = "'א' is the first latter in hebrew abc." .IsHebrewString(); // false
bool test5 = "אבגabc" .IsHebrewString(); // true
bool test6 = "abcאבג" .IsHebrewString(); // false
bool test7 = "()!^." .IsHebrewString(); // false