Alqoritm kateqoriyası altında paylaşmağı planlaşdırdığım əsas qrup yazılardan biri də praktikada rastlaşdığımız problemlər və onların həllində alqoritmlərin tətbiqidir. Çünki klassik alqoritmlərin izahı ilə bağlı internetdə kifayət qədər mənbə var və təbii ki, biz onlardan daha yaxşısını yaza bilməyəcəyik 🙂 Amma praktikada rastlaşdığımız problemlər daha spesifik və daha məxsusi ola bilər. Onların həllində klassik alqoritmlərin və yaxud özümüzün hazırladığımız hər hansı kiçik alqoritmlərin tətbiqi daha fərqli və maraqlı ola bilər.
Hal-hazırda fundamental bilikləri, nəzəri əsasları öyrənməyə fokuslandığımdan praktik tərəf ilə məşğul olmağa çox elə imkan yoxdur. Amma yenə də xırda-xırda problemlər qarşıma çıxdıqca paylaşmağa çalışacam. Bu yazıda isə ən son rastlaşdığım kiçik bir problem barədə yazacam.
Sözügedən problem vakansiyaların avtomatik paylaşılması ilə bağlı yazdığım bir proqramda baş verib. Deməli, proqram iş elanı saytlarından bir neçəsində paylaşılan vakansiyaları müəyyən vaxt intervalı ilə yoxlayır, məlumatları filterdən keçirir və qeyd edilmiş tələblərə uyğun proqramlaşdırma üzrə yerli və xarici vakansiyaları Facebook-da avtomatik paylaşır. Çox güman həmin saytlardan birinin kodlarında xırda dəyişiklik edilmişdi və xarici vakansiyalarda vəzifə adları iki dəfə təkrarlanırdı. Problemin nədən qaynaqlandığını tapdım və “selector”u dəyişərək təkrarlanmanı aradan qaldırdım. Amma məlumatlar bazada təkrarlanan formada qalmaqda idi, onları da yeniləmək lazım idi:
Bu təkrarlanmanı aradan qaldırmaq üçün istifadə etdiyim alqoritm aşağıdakı ardıcıllıqla işləyir:
- Mətindəki ilk söz tapılır;
- İlk sözün bitdiyi yerdən başlayaraq sona qədər həmin sözün təkrarlanıb təkrarlanmadığı yoxlanılır;
- Təkrarlanma tapılarsa, tapılan həmin nöqtə mərkəz kimi qəbul edilir;
- Başlanğıcdan mərkəzə qədər birinci hissə, mərkəzdən sona qədər isə ikinci hissə hesab edilir;
- Birinci hissə ilə ikinci hissə müqayisə edilir, əgər bir-birilərinə bərabər olarsa ikinci hissə silinir.
İndi isə qeyd etdiklərimizin Java dilində kodlaşdırılmasına baxaq (nümunə kimi göstərilmiş vəzifə adları məlumat bazasından götürülmüşdür):
package az.mm.algoritms; public class RemoveDuplicateWords { public static void main(String[] args) { String[] jobTitles = { "DataBase Solution Developer", "Java Developer", "C#.NET Developer", "Senior iOS Developer", "Application Developer for Application Development Division", "Senior Software Developer Senior Software Developer", "Senior Java Developer / Architect Senior Java Developer / Architect", "Lead C#.NET Software Engineer (Hyde Park) Lead C#.NET Software Engineer (Hyde Park)", "VB.NET Software Developer VB.NET Software Developer", "Android Developer Android Developer" }; System.out.println("----- Before -----"); print(jobTitles); removeDuplicateWords(jobTitles); System.out.println("\n----- After -----"); print(jobTitles); } public static void removeDuplicateWords(String[] arr) { String firstWord, firstPart, secondPart; int middleIndex; for (int i = 0; i < arr.length; i++) { firstWord = arr[i].split(" ")[0]; middleIndex = arr[i].indexOf(firstWord, firstWord.length()); if (middleIndex == -1) continue; firstPart = arr[i].substring(0, middleIndex).trim(); secondPart = arr[i].substring(middleIndex).trim(); if (firstPart.equals(secondPart)) arr[i] = firstPart; } } private static void print(String[] arr) { for (String text : arr) System.out.println(text); } }
Bəzi istisna hallar ola bilər ki, alqoritmdə onlar da nəzərə alınmalıdır, amma mənim problemimin həlli üçün bu alqoritm yetərli olduğundan kodda istisna hallar nəzərə alınmamışdır.
Təkrarlanma məlumat bazasında olduğundan problemin həll olunması üçün ən rahat yol sql sorğu vasitəsi ilə məlumatların redaktə edilməsi idi. Məlumat bazası kimi Sqlite istifadə edilir və yuxarıdakı alqoritm məntiqi tətbiq edilərək yazılmış aşağıdakı sql ifadə vasitəsi ilə problem həll edildi:
UPDATE vacancies SET job_title = TRIM(SUBSTR(job_title, 1, INSTR(job_title, ' '|| SUBSTR(job_title, 1, INSTR(job_title,' ')-1)))) WHERE id IN ( SELECT id FROM ( SELECT id, TRIM(SUBSTR(job_title, 1, middle)) AS FIRST, TRIM(SUBSTR(job_title, middle)) AS SECOND FROM ( SELECT id, job_title, INSTR(job_title, ' '|| SUBSTR(job_title, 1, INSTR(job_title,' ')-1)) AS middle FROM vacancies)) v WHERE v.first=v.second );