Bir çox açıq mənbəli Java layihələrinin mənbə kodunu təhlil edərək, əksər tərtibatçıların çeşidləməni yalnız iki fərqli şəkildə həyata keçirdiklərini gördüm. Onlardan biri və ya
sort()
sinif metodunun istifadəsinə , digəri isə və kimi öz-özünə çeşidlənən məlumat strukturlarının istifadəsinə əsaslanır . Collections
Arrays
TreeMap
TreeSet
Sort() metodundan istifadə etməklə
Kolleksiyanı çeşidləmək lazımdırsa, istifadə edinCollections.sort()
.
// Collections.sort(…)
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
Massivi çeşidləmək lazımdırsa, istifadə edin Arrays.sort()
.
// Arrays.sort(…)
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sort()
Kolleksiya və ya massiv artıq dəyərlərlə doldurulduqda üsul çox rahatdır.
Öz-özünə çeşidlənən məlumat strukturlarından istifadə
List
Siyahını çeşidləmək ( ) və ya ( ) təyin etmək lazımdırsa Set
, TreeSet
çeşidləmə strukturundan istifadə edin.
// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedSet.addAll(unsortedSet);
Əgər lüğəti çeşidləmək lazımdırsa ( Map
), TreeMap
çeşidləmə strukturundan istifadə edin. TreeMap
düyməsinə ( ) görə sıralanır key
.
// TreeMap – использующий String ключи и компаратор (Comparator) CASE_INSENSITIVE_ORDER,
// упорядочивающий строки (String) методом compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap – общий случай, компаратор указывается вручную
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedMap.putAll(unsortedMap);
Yuxarıdakı yanaşma kolleksiyadakı elementlər üçün çoxlu sayda axtarış aparmağınız lazım olduğu hallarda çox faydalıdır. Öz-özünə çeşidlənən məlumat strukturları O(log(n))
daha yaxşı effektivliyə malikdir O(n)
. Bu o deməkdir ki, kolleksiyadakı məlumatların miqdarı iki dəfə artdıqda, axtarış vaxtı iki dəfə deyil, sabit miqdar artır .
Problemin çeşidlənməsinə pis yanaşma
Siz hələ də proqramçıların çeşidləmə alqoritmlərini müstəqil şəkildə təsvir etdiyi nümunələri tapa bilərsiniz. Aşağıda təqdim olunan çeşidləmə kodunu nəzərdən keçirin (ikiqat massivi artan qaydada çeşidləyin ). Bu kod təkcə səmərəsiz deyil, həm də oxunmur. Və belə misallar çoxdur.double t;
for (int i = 0; i < N; i++)
for (int j = i + 1; j < N; j++)
if (r[j] < r[i]) {
t = r[i];
r[i] = r[j];
r[j] = t;
}
GO TO FULL VERSION