Bir sınıf ne zaman Karşılaştırılabilir ve / veya Karşılaştırıcı olmalıdır?


138

Karşılaştırılabilir ve Karşılaştırıcıları uygulayan sınıflar gördüm . Ne anlama geliyor? Neden birini diğerinin üzerinde kullanayım?


18
Onları javadok okudun mu? Farklılığı oldukça açık bir şekilde tanımlar.
skaffman

1
Karşılaştırılabilir ve karşılaştırıcı nedir ve karşılaştırılabilir ve karşılaştırıcı ne zaman kullanılır. Bunları bilmek için bu linki okuyun. bu onların davranışlarını ve kullanımını anlamanıza yardımcı olacaktır. http://iandjava.blogspot.in/2012/10/comparable-and-comparator.html
RockStar

6
Bu iyi, nesnel bir cevabı olan iyi bir soru. Kapalı olduğu için dehşete düştüm.
Russell Silva

3
StackOverflow ile ilgili diğer sorular , buna "Karşılaştırıcı ve karşılaştırılabilir arasındaki fark nedir" sorusu olarak atıfta bulunur. Neden "yapıcı değil" olarak işaretlenmiş? Bir Java Newbie olarak, bu çok yararlı bir soruydu!
Pete

Yanıtlar:


241

Aşağıdaki metin Karşılaştırıcıya Karşı Karşılaştırılabilir

karşılaştırılabilir

Karşılaştırılabilir bir nesne, kendisini başka bir nesneyle karşılaştırabilir. Sınıfın kendi java.lang.Comparableörneklerini karşılaştırabilmesi için arabirimi uygulaması gerekir .

Karşılaştırıcı

Bir karşılaştırma nesnesi iki farklı nesneyi karşılaştırabilir. Sınıf kendi örneklerini değil, başka bir sınıfın örneklerini karşılaştırır. Bu karşılaştırma sınıfı java.util.Comparatorarabirimi uygulamalıdır .


hem Karşılaştırıcı hem de karşılaştırılabilir kullanımlarının ayrıntılı açıklaması için: sysdotoutdotprint.com/index.php/2017/03/28/…
mel3kings


@ mel3kings - Bağlantıya artık erişilemiyor.
Gaurav

152

Uygulama Comparable" Kendimi başka bir nesneyle karşılaştırabilirim " anlamına gelir . Bu, genellikle tek bir doğal varsayılan karşılaştırma olduğunda yararlıdır.

Uygulama Comparator" Diğer iki nesneyi karşılaştırabilirim " anlamına gelir . Bu genellikle bir türdeki iki örneği karşılaştırmanın birden çok yolu olduğunda yararlıdır - örneğin, insanları yaşa, ada göre karşılaştırabilirsiniz.


1
Merhaba skeet, karşılaştırılabilir ve karşılaştırıcı kullanarak kodu bırakabilir misiniz?
Mdhar9e

5
@ mdhar9e: Etrafta birçok örnek var - bunları kendi senaryonuza çevirmekte zorlanıyorsanız, lütfen yeni bir soruda daha fazla bilgi verin.
Jon Skeet

2
@alireza: İkinci paragrafta zaten bir örnek verdim: farklı karşılaştırıcılara sahip olarak, aynı koleksiyonu (insanlar) farklı mülklere (yaş, isim vb.) göre sıralayabilirsiniz. Sadece yaparak bunu yapamaz Personuygulamak Comparableardından değiştiremezsiniz çünkü, nasıl iki kişi karşılaştırılır.
Jon Skeet

1
@feelgoodandprogramming: Hayır, bunlar farklı sıralama algoritmalarıdır . Burada, üç farklı sınıfta potansiyel olarak üç kod parçası vardır: 1) İşletmenin kendisi, ör Person. 2) Karşılaştırıcı, örneğin PersonAgeComparatoriki farklı varlığı karşılaştırabilen ve o sıralama düzeninde hangisinin önce geleceğine karar verebilen. 3) Varlıkların bir koleksiyonunu ve bir karşılaştırıcıyı alan ve siparişi belirlemek için karşılaştırıcıyı kullanarak bu koleksiyonu sıralar.
Jon Skeet

2
@RishiKeshPathak: Karşılaştırılacak tek bir tek şey varsa Karşılaştırılabilir'i kullanmak daha çok. Ve hatta o zaman olabilir sadece Karşılaştırıcısı yazın. Aynı sınıfı kullanan iki farklı programınız varsa ve biri sadece yaşa göre, diğeri de ada göre sıralamak istiyorsa , bunlardan en az birinin bir Karşılaştırıcı kullanması gerekir.
Jon Skeet

38

Karşılaştırılabilir bir sınıf kendi karşılaştırmasını uygulama sağlar:

  • İçinde aynı sınıfta (genellikle bir avantajdır)
  • olabilir tek uygulama (eğer iki farklı durumlarda istiyorsanız o kullanamaması için)

Karşılaştırıldığında, Karşılaştırıcı harici bir karşılaştırmadır:

  • tipik olarak benzersiz bir durumdadır (aynı sınıfta veya başka bir yerde)
  • her uygulamaya ad veriyorsunuz şeyler sıralamak istediğiniz yolu ile
  • karşılaştırıcılar sağlayabilir kontrol etmediğiniz sınıflar
  • ilk nesne boş olsa bile uygulama kullanılabilir

Her iki uygulamada da, karşılaştırılmasını istediğiniz şeyi seçebilirsiniz. . Jenerikler ile, bunu beyan edebilir ve derleme zamanında kontrol ettirebilirsiniz. Bu güvenliği arttırır, ancak uygun değeri belirlemek de zordur.

Bir kılavuz olarak, genellikle bu nesnenin karşılaştırılabileceği en genel sınıfı veya arabirimi kullanırım, tüm kullanım durumlarında öngördüğüm ... Çok kesin bir tanım değil! :-(

  • Comparable<Object>derleme zamanında tüm kodlarda kullanmanıza izin verir (gerekirse iyi veya değilse kötüdür ve derleme zamanı hatasını kaybedersiniz); uygulamanız nesnelerle başa çıkmak ve gerektiğinde sağlam bir şekilde yayın yapmak zorundadır.
  • Comparable<Itself> aksine çok katı.

Komik, Kendini Alt Sınıfa alt sınıflandırdığınızda, Alt Sınıf da Karşılaştırılabilir olmalı ve bu konuda sağlam olmalıdır (veya Liskov İlkesini kırar ve çalışma zamanı hataları verir).


20

java.lang.Comparable

  1. Uygulamak için Comparablebir arayüz, sınıfı tek bir yöntemi uygulamalıdırcompareTo()

    int a.compareTo(b)

  2. Örneğini sıralamak istediğiniz sınıfı değiştirmeniz gerekir. Böylece sınıf başına sadece bir sıralama dizisi oluşturulabilir.

java.util.Comparator

  1. Karşılaştırıcı arabirimini uygulamak için sınıf tek bir yöntem uygulamalıdır compare()

    int compare (a,b)

  2. Örneğini sıralamak istediğiniz sınıftan ayrı bir sınıf oluşturursunuz. Böylece sınıf başına birden fazla sıralama dizisi oluşturulabilir.

14

Comparable veri nesneleri üzerinde, örneğin veri nesneleri doğal sıraya sahipse, varsayılan bir sıralama sağlamak içindir.

A Comparator, siparişin kendisini belirli bir kullanım için temsil eder.


8

Comparablegenellikle tercih edilir. Ancak bazen bir sınıf zaten uygulanır Comparable, ancak farklı bir mülke göre sıralama yapmak istersiniz. Sonra birComparator .

Bazı sınıflar aslında Comparatorsortak vakalar sağlar; örneğin, Strings sıralandıklarında varsayılan olarak büyük / küçük harfe duyarlıdır, ancak Comparatorçağrılan bir statik de vardır CASE_INSENSITIVE_ORDER.


7
Karşılaştırılabilir tercih edilmeye katıldığımdan emin değilim. Bazı nesnelerin güçlü bir doğal düzen duygusu vardır - yani tüm biçimlerindeki sayılar: doğal sayılar, gerçek sayılar, tarihler vb. Ancak karakter dizeleri gibi diğer nispeten ilkel nesneler bile evrensel olarak uygulanabilir bir düzene sahip değildir. Uygulama etki alanı modelindeki bir varlık gibi daha karmaşık nesneler söz konusu olduğunda, Karşılaştırılabilir'i uygulamak genellikle bir hatadır. Birçok özelliği, en sık hangi düzenin isteneceğini tahmin etmeyi çok zorlaştırır.
erickson

6

Web'de bulunan Karşılaştırıcı ve Karşılaştırılabilir I arasındaki birkaç fark var:

  1. Görüyorsanız, bu ikisi arasındaki mantıksal fark Java'da Karşılaştırıcı'dır, kendisine sağlanan iki nesneyi karşılaştırırken, Karşılaştırılabilir arabirim "bu" başvuruyu belirtilen nesneyle karşılaştırır.

  2. Java ile karşılaştırılabilir nesnenin doğal düzenini uygulamak için kullanılır. Java API Dizesinde, Date ve wrapper sınıfları Karşılaştırılabilir arabirimi uygular.

  3. Herhangi bir sınıf Java'da Karşılaştırılabilir arabirimi uygularsa, o nesnenin toplanması List.s veya (Array.sort () yöntemi kullanılarak otomatik olarak sıralanabilir ve nesne, CompareTo yöntemiyle tanımlanan doğal sıraya göre sıralanır.

  4. Java'da Karşılaştırılabilir'i uygulayan nesneler, herhangi bir Karşılaştırıcı belirtmeden, sıralanmış bir haritada anahtarlar veya sıralı bir kümede örneğin TreeSet'te öğeler olarak kullanılabilir.

site: Java'da Karşılaştırıcı ve Karşılaştırılabilir nasıl kullanılır? Örnek olarak

Devamını oku: Karşılaştırıcı ve Karşılaştırılabilir Java'da nasıl kullanılır? Örnek olarak


5

Comparabledoğal düzeni olan nesneler içindir. Nesnenin kendisi nasıl sipariş edileceğini bilir.
Comparatordoğal sıralaması olmayan veya farklı bir sıralamayı kullanmak istediğiniz nesneler içindir.


4

Karşılaştırıcı ve Karşılaştırılabilir arayüzler arasındaki fark

Comparable kendisini başka bir nesneyle karşılaştırmak için kullanılır.

Comparator iki veri türünü karşılaştırmak için kullanılan nesnelerdir.


2

Görüyorsanız, bu ikisi arasındaki mantıksal fark ComparatorJava'dadır, kendisine sağlanan iki nesneyi karşılaştırın.Comparable karşılaştırırken arabirim "bu" başvuruyu belirtilen nesneyle karşılaştırır.

ComparableJava'da nesnenin doğal düzenini uygulamak için kullanılır. Java API Dizesinde, Date ve wrapper sınıfları uygulanırComparable arabirimi .

ComparableJava'da herhangi bir sınıf uygulama arayüzü varsa , o nesnenin toplanması Listveya Arraykullanılarak otomatik olarak sıralanabilir Collections.sort()veya Array.sort()yöntem ve nesne tarafından tanımlanan doğal sıraya göre sıralanır.compareTo yöntemle .

ComparableJava'da uygulanan nesneler , sıralı bir haritada anahtarlar veya sıralı bir kümedeki öğeler olarak TreeSetherhangi bir belirtmeksizin anahtar olarak kullanılabilir Comparator.


0

Karşılaştırılabilir ve Karşılaştırıcıyı uygulamak için ek açıklama kitaplığım:

public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         

    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
} 

Daha fazla örnek görmek için bağlantıyı tıklayın. compamatic


3
Stackoverflow'a hoş geldiniz. Bu soru eskidir ve zaten cevaplanmıştır. Genellikle, yanıtınız önceki yanıtlara göre önemli ölçüde yeni veya farklı bir katkıda bulunmadıkça, eski konuları yeniden yönlendirmemek en iyisidir.
Oers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.