Karşılaştırıcı, koleksiyonları sıralama - 1

"Merhaba, Amigo!"

"Merhaba, Bilaabo!"

"Bugün küçük ama ilginç ve yararlı bir konuyu inceleyeceğiz: koleksiyonları sıralama."

"Ayırma mı? Bununla ilgili bir şeyler duydum."

"Uzun zaman önce, her programcının sıralama algoritmaları yazabilmesi gerekiyordu. Bunları yazabiliyordu ve yazmak zorundaydı. icat edildi."

"Java'da (ve diğer programlama dillerinde), sıralama zaten uygulanıyor.  Senin görevin, zaten var olanı doğru kullanmayı öğrenmek. "

"TAMAM."

" Koleksiyon yardımcı sınıfı, koleksiyonları veya daha doğrusu listeleri sıralamak için kullanılan statik bir sıralama yöntemine sahiptir. Haritalar ve Kümelerdeki öğelerin bir düzeni/dizini yoktur, dolayısıyla sıralanacak hiçbir şey yoktur."

"Evet, hatırlıyorum. Bu yöntemi bir kez bir sayı listesini sıralamak için kullanmıştım."

"Harika. Ancak bu yöntem ilk bakışta göründüğünden çok daha güçlü. Yalnızca sayıları değil, tüm nesneleri de herhangi bir kritere göre sıralayabilir. Yöntemin bunu yapmasına iki arabirim yardımcı olur: Comparable ve Comparator . "

"Bazen sayıları değil nesneleri sıralamanız gerekir. Örneğin, bir insan listeniz olduğunu ve bunları yaşa göre sıralamak istediğinizi varsayalım. Bunun için Karşılaştırılabilir arayüzümüz var . "

"Önce size bir örnek göstereyim, sonra her şey daha netleşecek:"

Örnek
public class Woman implements Comparable<Woman>
{
public int age;

public Woman(int age) {
this.age = age;
}

public int compareTo(Woman o)
{
return this.age - o.age;
}
}
Nasıl kullanılabileceğine dair bir örnek:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Collections.sort(women);
}

"Nesneleri sıralamak için önce onları nasıl karşılaştıracağınızı bilmelisiniz. Bunun için Comparable kullanıyoruz. Comparable arabirimi geneldir , yani bir tür argümanını kabul eder. Yalnızca bir genel yöntemi vardır: CompareTo(T o). Bu yöntem, geçerli nesneyi (this) ve argüman olarak iletilen bir nesneyi (o) karşılaştırır.Başka bir deyişle, bu yöntemi sınıfımızda uygulamamız ve ardından geçerli nesneyi (this) geçen nesneyle karşılaştırmak için kullanmamız gerekir. "

"Peki CompareTo nasıl çalışıyor? Geçirilen nesnenin daha büyük veya daha küçük olmasına bağlı olarak doğru veya yanlış olarak dönmesini bekliyordum."

"Burada işler daha karmaşık. CompareTo yöntemi doğru/yanlış döndürmez. Bunun yerine bir int döndürür. Bu aslında basitlik için yapılır.

"Bir bilgisayar bir sayının diğerinden büyük olup olmadığını belirlemesi gerektiğinde, yalnızca ikinci sayıyı birinciden çıkarır ve sonuca bakar. Sonuç 0 ise sayılar eşittir. Sonuç sıfırdan küçükse , o zaman ikinci sayı daha büyüktür. Ve sonuç sıfırdan büyükse, o zaman ilk sayı daha büyüktür."

"Aynı mantık burada da geçerlidir. Spesifikasyona göre, karşılaştırılan nesneler eşitse, CompareTo yöntemi sıfır döndürmelidir. CompareTo yöntemi sıfırdan büyük bir sayı döndürürse, nesnemiz geçirilen nesneden daha büyüktür. yöntemi sıfırdan küçük bir sayı döndürür, ardından 'bu' iletilen nesneden küçüktür."

"Bu biraz tuhaf."

"Evet, ama nesneleri yalnızca bazı sayısal özelliklere göre karşılaştırıyorsanız, o zaman aralarındaki farkı, birini diğerinden çıkararak elde edebilirsiniz. Tıpkı yukarıdaki örnekte yapıldığı gibi."

public int compareTo(Woman o)
{
return this.age - o.age;
}

"Sanırım her şeyi anlıyorum. Ama belki de değil. Ama neredeyse her şeyi."

"Harika. Şimdi daha pratik bir problem düşünelim. Diyelim ki Çin'de kadın kıyafetleri yapmak için harika bir web sitesi yazdınız. Müşterilerinizi tanımlamak için bir Woman sınıfı kullanıyorsunuz. Hatta hepsini görebileceğiniz bir tablo içeren bir web sayfası bile yaptınız. . Ama bir sorun var..."

"Kadın nesneniz yalnızca bir yaş değil, aynı zamanda bir sürü başka veri içerir: ad, soyad, boy, kilo, çocuk sayısı, vb."

"Kullanıcılar tablosunda çok sayıda sütun var ve soru şu: Kullanıcılarınızı çeşitli kriterlere göre nasıl sıralarsınız? Ağırlığa, yaşa, soyadına göre?"

"Hmm. Evet, sık sık sütunlara göre sıralama yapmanızı sağlayan tablolar görüyorum. Peki, bunu nasıl yapıyorsunuz?"

"Bunun için bugün size bahsetmek istediğim ikinci arayüze sahibiz: Comparator arayüzü. Bunun da bir Compare yöntemi var ama bir değil iki argüman alıyor: int Compare(T o1, T o2). İşte böyle. İşler:"

Örnek
public class Woman
{
public int age;
public int childrenCount;
public int weight;
public int height;
public String name;

public Woman(int age) {
this.age = age;
}
}
Nasıl kullanılabileceğine dair bir örnek:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Comparator<Woman> compareByHeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.height - o2.height;
}
};

Collections.sort(women, compareByHeight);
}

"Karşılaştırıcı arabirimi, karşılaştırılan nesnelerin sınıfı içindeki nesne karşılaştırma mantığını gizlemez. Bunun yerine, ayrı bir sınıfta uygulanır."

"Yani, Karşılaştırıcı arabirimini uygulayan birkaç sınıf oluşturabilir ve her birinin farklı özellikleri karşılaştırmasını sağlayabilirim? Birinde kilo, diğerinde yaş ve üçüncüsünde boy?"

"Evet, çok basit ve kullanışlı."

" Comparator arayüzünü uygulayan ve size sıralama sürecinde nesne çiftlerini nasıl doğru bir şekilde karşılaştıracağınızı söyleyen ikinci argüman olarak nesnelerin bir listesini ve başka bir özel nesneyi ileterek Collections.sort yöntemini çağırıyoruz ."

"Hmm. Sanırım her şeyi anladım. Bir deneyeyim. Diyelim ki kullanıcıları ağırlıklarına göre sıralamam gerekiyor. Şöyle bir şey olurdu:"

Kullanıcıları ağırlığa göre sıralama örneği:
Comparator<Woman> compareByWeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.weight - o2.weight;
}
};

Collections.sort(women, compareByWeight);

"Evet kesinlikle."

"Harika. Ama ya ters sırada sıralamak istersem?"

"Bir düşünün. Cevap çok basit!"

"Buldum! Bunun gibi:"

Artan düzende sıralama:
return o1.weight - o2.weight;
Azalan düzende sıralama:
return o2.weight – o1.weight;

"Doğru. Aferin."

"Ya soyadına göre sıralamak istersem? Dizeleri nasıl sıralarım, Bilaabo?"

"String sınıfı, CompareTo yöntemini zaten uyguluyor. Onu çağırmanız yeterli:"

Kullanıcıları ada göre sıralama örneği:
Comparator<Woman> compareByName = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.name.compareTo(o2.name);
}
};

Collections.sort(women, compareByName);

"Bu harika bir dersti Bilaabo. Çok teşekkür ederim."

"Ve sana teşekkür ederim dostum!"