Java で 2 つのオブジェクトのサイズを比較する 3 つの方法の概要と共有

WBOY
リリース: 2022-09-09 13:46:54
転載
3458 人が閲覧しました

この記事は、java に関する関連知識を提供します。優先キューに挿入される要素は、サイズが同等である必要があります。2 つの学生タイプの要素を挿入するなど、サイズを比較できない場合、ClassCastException 例外が発生します。報告される。 Java で 2 つのオブジェクトの大きさを比較する 3 つの方法を以下に紹介しますので、皆さんの参考になれば幸いです。

Java で 2 つのオブジェクトのサイズを比較する 3 つの方法の概要と共有

推奨学習: 「Java ビデオ チュートリアル

1. 比較オブジェクトが必要な理由

前のセクション優先キューが導入されました。優先キューに挿入される要素は、サイズが同等である必要があります。2 つの学生タイプの要素を挿入するなど、サイズを比較できない場合は、ClassCastException が報告されます。

例:

class Student{
    String name;
    int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",25);
        Student s2 = new Student("李四",31);
        PriorityQueue<Student> p = new PriorityQueue<>();
        p.offer(s1);
        p.offer(s2);
    }
}
ログイン後にコピー

結果:

原因: 優先キューの最下層はヒープ データ構造を使用しているため、要素をヒープに挿入するときに要素を比較する必要があります。直接比較する方法がないため、例外がスローされます

2. 要素の比較

1. 基本型の比較

Java では、基本型の要素

public class TestCompare {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a>b);
        System.out.println(a==b);
        System.out.println(a<b);
 
        char c1 = &#39;a&#39;;
        char c2 = &#39;b&#39;;
        System.out.println(c1==c2);
        System.out.println(c1>c2);
        System.out.println(c1<c2);
 
        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1==b2);
        System.out.println(b1!=b2);
    }
}
ログイン後にコピー

2. 参照型の比較

class Student{
    String name;
    int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",25);
        Student s2 = new Student("李四",31);
        Student s3 = s1;
        System.out.println(s1==s2);  //false
        System.out.println(s1==s3);  //true
        //System.out.println(s1<s2); 编译报错
        //System.out.println(s1>s3); 编译报错
    }
}
ログイン後にコピー

上記の結果から判断すると、カスタム型は >、< を使用して比較することはできません。なぜ == を使用して比較できるのでしょうか。 ?

==カスタム タイプを比較する場合、比較されるのはオブジェクトのアドレスが同じかどうかです。

ただし、オブジェクトをプライオリティキューに従う必要があります。オブジェクトの内容はヒープを調整するために使用されるので、どのように比較するのでしょうか?

3. オブジェクトの比較メソッド

1. equals メソッドの比較

Object クラスは各クラスの基本クラスであり、コンテンツを比較するためのquals() メソッドを提供します。それらは同じです

#しかし、Objectのequalsメソッドはデフォルトで==を使用して比較し、2つのオブジェクトのアドレスを比較するため、カスタムタイプを作成したいと考えています。基本クラスのequals()メソッドをオーバーライドできます。

例:

class Student{
    String name;
    int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }
        if(obj==null || !(obj instanceof Student)){
            return false;
        }
        Student s = (Student) obj;
        return this.age==s.age && this.name.equals(s.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",25);
        Student s2 = new Student("李四",31);
        Student s3 = new Student("李四",31);
        System.out.println(s1.equals(s2));
        System.out.println(s2.equals(s3));
    }
}
ログイン後にコピー

結果:内容が同じかどうかを比較できます

equals メソッドをオーバーライドする手順

  • 2 つのオブジェクトのアドレスが同じ場合、true を返します
  • 受信オブジェクトがnull、falseを返します
  • 受信オブジェクトと呼び出しオブジェクトが同じ型でない場合は、falseを返します
  • 内容が同じ場合はtrueを返し、それ以外の場合はfalseを返します

注意

equals() メソッドは 2 つのオブジェクトが同じかどうかのみを比較でき、>、<

2 に従って比較することはできません。 Comparable インターフェイスに基づく比較

参照型の場合、サイズに基づいて比較する場合は、クラスを定義するときに Comparable インターフェイスを実装し、クラスの CompareTo メソッドをオーバーライドします。

例: 通常は年齢に基づいて 2 人の人のサイズを比較します

class Person implements Comparable<Person>{
    String name;
    int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public int compareTo(Person o) {
        if(o == null){
            return 1;
        }
        return this.age-o.age;
    }
}
public class Test1 {
    public static void main(String[] args) {
        Person p1 = new Person("小王",22);
        Person p2 = new Person("小张",21);
        Person p3 = new Person("小方",22);
        System.out.println(p1.compareTo(p2)); //>0表示大于
        System.out.println(p2.compareTo(p3)); //<0表示小于
        System.out.println(p1.compareTo(p3)); //==0表示相等
    }
}
ログイン後にコピー

compareTo メソッドは java.lang のインターフェイス クラスであり、直接使用できます。

Comparable インターフェイスを使用すると、次のタイプのオブジェクトが許可されます。優先キューに挿入される学生

import java.util.PriorityQueue;
 
class Student implements Comparable<Student> {
    String name;
    int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public int compareTo(Student o) {
        if(o == null){
            return -1;
        }
        return this.age-o.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",25);
        Student s2 = new Student("李四",31);
        Student s3 = new Student("李四",35);
        PriorityQueue<Student> p = new PriorityQueue<>();
        p.offer(s1);
        p.offer(s2);
        p.offer(s3);
    }
}
ログイン後にコピー

結果: 学生タイプのオブジェクトも優先キューに挿入できます

3. コンパレータに基づく比較インターフェイス

コンパレータに応じた比較の具体的な手順は次のとおりです。

  • コンパレータ クラスを作成し、Comparator インターフェイスを実装します。
  • compare メソッドをオーバーライドします。

コンパレータを使用して、Student タイプのオブジェクトを優先キューに挿入できるようにします。

import java.util.Comparator;
import java.util.PriorityQueue;
 
class Student {
    String name;
    int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class StudentComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        if(o1 == o2){
            return 0;
        }
        if(o1 == null){
            return -1;
        }
        if(o2 == null){
            return 1;
        }
        return o1.age-o2.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",25);
        Student s2 = new Student("李四",31);
        Student s3 = new Student("李四",35);
        PriorityQueue<Student> p = new PriorityQueue<>(new StudentComparator());
        p.offer(s1);
        p.offer(s2);
        p.offer(s3);
    }
}
ログイン後にコピー

結果: Student タイプのオブジェクトを優先キューに挿入できるようにします。

Comparator は java.util パッケージの汎用インターフェイス クラスです。対応するパッケージをインポートして使用する必要があります。

4. 3 つの比較メソッド

書き換え方法 説明
Object.equals 2つのオブジェクトの内容が等しいかどうかのみを比較でき、サイズは比較できません
Comparable.compareTo Class インターフェイスを実装するには、クラスに非常に侵入し、元のクラスの構造を破壊します。
Comparator.compare コンパレータ クラスを実装する必要があります。これはクラス Weak に侵入し、元のクラスを破壊しません

Comparable、Comparator はどのような比較方法を使用しますか?

他の人が定義したクラスを取得した場合、そのクラスを操作することはできないため、クラスを作成するメソッドを使用して Comparator インターフェイスを実装できます

クラスが定義されたクラスの場合ユーザーは、クラスを操作できます。操作するには、Comparable インターフェイスを実装するメソッドを使用します。

推奨される学習: "Java ビデオ チュートリアル "

以上がJava で 2 つのオブジェクトのサイズを比較する 3 つの方法の概要と共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!