この記事は、java に関する関連知識を提供します。優先キューに挿入される要素は、サイズが同等である必要があります。2 つの学生タイプの要素を挿入するなど、サイズを比較できない場合、ClassCastException 例外が発生します。報告される。 Java で 2 つのオブジェクトの大きさを比較する 3 つの方法を以下に紹介しますので、皆さんの参考になれば幸いです。
推奨学習: 「Java ビデオ チュートリアル 」
前のセクション優先キューが導入されました。優先キューに挿入される要素は、サイズが同等である必要があります。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); } }
結果:
原因: 優先キューの最下層はヒープ データ構造を使用しているため、要素をヒープに挿入するときに要素を比較する必要があります。直接比較する方法がないため、例外がスローされます
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 = 'a'; char c2 = 'b'; 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); } }
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); 编译报错 } }
上記の結果から判断すると、カスタム型は >、79aad9477cd9b8ddaa42257a9de80431、<
参照型の場合、サイズに基づいて比較する場合は、クラスを定義するときに 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); } }
結果: 学生タイプのオブジェクトも優先キューに挿入できます
コンパレータに応じた比較の具体的な手順は次のとおりです。
コンパレータを使用して、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 パッケージの汎用インターフェイス クラスです。対応するパッケージをインポートして使用する必要があります。
書き換え方法 | 説明 |
---|---|
Object.equals | 2つのオブジェクトの内容が等しいかどうかのみを比較でき、サイズは比較できません |
Comparable.compareTo | Class インターフェイスを実装するには、クラスに非常に侵入し、元のクラスの構造を破壊します。 |
Comparator.compare | コンパレータ クラスを実装する必要があります。これはクラス Weak に侵入し、元のクラスを破壊しません |
Comparable、Comparator はどのような比較方法を使用しますか?
他の人が定義したクラスを取得した場合、そのクラスを操作することはできないため、クラスを作成するメソッドを使用して Comparator インターフェイスを実装できます
クラスが定義されたクラスの場合ユーザーは、クラスを操作できます。操作するには、Comparable インターフェイスを実装するメソッドを使用します。
推奨される学習: "Java ビデオ チュートリアル "
以上がJava で 2 つのオブジェクトのサイズを比較する 3 つの方法の概要と共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。