Java SortedSetが自動ソートを実行できるのはなぜですか?

Set内のSortedSet(SortedSetはTreeSetの実装インターフェース)、それらの間の継承関係は次のとおりです。

java.util.Set;

java.util.SortedSet; 

java.util.TreeSet; 

SortedSetの要素は順序付けされておらず、繰り返しはできませんが、格納されている要素は要素サイズの順に自動的にソートできます。次のコードと組み合わせる:

 

import java.util.*;
import java.text.*;
public class SortedSetTest01{
 public static void main(String[] args)throws Exception{
   SortedSet ss=new TreeSet();
   //数字类
   ss.add(12);
   ss.add(23);
   ss.add(45);
   ss.add(39);
   ss.add(45);
   Iterator it=ss.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
   //String类
   SortedSet str=new TreeSet();
   str.add("JACK");
   str.add("TOM");
   str.add("KING");
   str.add("SUN");
   it=str.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
   //日期类
   String st1="2003-08-12";
   String st2="2004-09-17";
   String st3="2003-04-12";
   String st4="2013-09-04";
   
   SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
   Date t1=sdf.parse(st1);
   Date t2=sdf.parse(st2);
   Date t3=sdf.parse(st3);
   Date t4=sdf.parse(st4);
   
   SortedSet times=new TreeSet();
   times.add(t1);
   times.add(t2);
   times.add(t3);
   times.add(t4);
   
   it=times.iterator();
   while(it.hasNext()){
     Object element=it.next();
     if(element instanceof Date){
       Date d=(Date)element;
       System.out.println(sdf.format(d));
     }
   }
 }
}

 

コンパイルして実行した後の出力:

 

12
23
39
45
JACK
KING
SUN
TOM
2003-04-12
2003-08-12
2004-09-17
2013-09-04

 

上記のコードは、SortedSetに格納されている要素を、要素のサイズに応じて並べ替えることができることを示しています。これらの要素は、数値、文字列、または日付にすることができます。SortedSetのこの機能を理解したところで、SortedSetコレクションのストレージ要素を自動的にソートできるのはなぜですか?

 

上記のコードでは、数値、文字列、日付の自動並べ替えをSortedSetに実装しています。複数のユーザータイプオブジェクトをカスタマイズし、それらをSortedSetコレクションに追加すると、次のような自動化を実現できます。ソート?やってみて。

 

import java.util.*;
public class SortedSetTest02{
 public static void main(String[] args){
   SortedSet users=new TreeSet();
   User u1=new User(12);
   User u2=new User(16);
   User u3=new User(23);
   User u4=new User(32);
   User u5=new User(43);
   
   users.add(u1);
   users.add(u2);
   users.add(u3);
   users.add(u4);
   users.add(u5);
   Iterator it=users.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
 }
}
class User{
 int age;
 User(int age){
   this.age=age;
 }
 public String toString(){
   return "User[age="+age+"]";
 }
}

 

コンパイルして渡す、実行後のエラー、出力:

スレッド「メイン」の例外java.lang.ClassCastException:ユーザーはjava.lang.Comparableにキャストできません

java.util.TreeMap.compare(Unknown Source)で

java.util.TreeMap.put(Unknown Source)で

java.util.TreeSet.add(Unknown Source)で

SortedSetTest02.main(SortedSetTest02.java:14)で

ユーザーをjava.lang.Comparableにキャストできません。つまり、ユーザーを比較可能なタイプにキャストできません。したがって、ユーザーはComparableインターフェイスを実装する必要があります(つまり、最初のプログラム例の数値、文字列、日付は、ユーザーがComparable {}を実装するクラスであるComparableインターフェイスを既に実装しています)。インターフェイスを実装するクラスがこのインターフェイスのすべてのメソッドを実装することはわかっています。SortedSetコレクションの要素を自動的に並べ替えることができるのは、add()メソッドを使用して追加された要素がComparableインターフェイスのCompareTo()メソッドを実装するためです。

上記のコードで、ユーザーの年齢に従ってソートされた要件を与える場合、比較ルールを記述する必要があります。

 

public int compareTo(Object o){
   //编写一个比较规则
   int age1=this.age;
   int age2=((User)o).age;
   return age1-age2;
 }

 

compareToの使用法はu1.compareTo(u2)、これはu1、括弧内のパラメーターoはu2です。括弧内のパラメータータイプはオブジェクトタイプであり、オブジェクトタイプには年齢属性がないため、oをユーザーにキャストする必要があります。タイプ、(ユーザー)o。変更後の全体的なコードは次のとおりです。

 

import java.util.*;
public class SortedSetTest02{
 public static void main(String[] args){
   SortedSet users=new TreeSet();
   User u1=new User(12);
   User u2=new User(16);
   User u3=new User(23);
   User u4=new User(32);
   User u5=new User(43);
   
   users.add(u1);
   users.add(u2);
   users.add(u3);
   users.add(u4);
   users.add(u5);
   Iterator it=users.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
   }
 }
}
class User implements Comparable{
 int age;
 User(int age){
   this.age=age;
 }
 public String toString(){
   return "User[age="+age+"]";
 }
 //实现java.lang.Comparable;接口中的compareTo方法
 //该方法程序员负责实现,SUN提供的程序已经调用了该方法
 //需求:按照User的年龄排序
 public int compareTo(Object o){  //u1.compareTo(u2)
   //编写一个比较规则
   int age1=this.age;   
   int age2=((User)o).age;
   return age1-age2;
 }
}

 

コンパイルして実行した後の出力:

 

User[age=12]
User[age=16]
User[age=23]
User[age=32]
User[age=43]

 

さらに、SortedSetコレクションをソートする別の方法があります:java.util.Comparatorを使用して、TreeSetコレクションの作成時に提供される個別のコンパレーター、つまりSortedSet products = new TreeSet(new ProductComparator( ));コードは次のとおりです。

 

import java.util.*;
public class SortedSetTest03{
 public static void main(String[] args){
   //创建TreeSet集合的时候提供一个比较器
   SortedSet products=new TreeSet(new ProductComparator());
   Product p1=new Product(3.4);
   Product p2=new Product(4.0);
   Product p3=new Product(3.6);
   Product p4=new Product(7.6);
   Product p5=new Product(3.7);
   
   products.add(p1);
   products.add(p2);
   products.add(p3);
   products.add(p4);
   products.add(p5);
   
   Iterator it=products.iterator();
   while(it.hasNext()){
     System.out.println(it.next());
     }
 }
}
class Product{
 double price;
 Product(double price){
   this.price=price;
 }
 public String toString(){
   return price + "";
 }
}
//单独编写一个比较器
class ProductComparator implements Comparator{
 //需求:按照商品价格排序
 public int compare(Object o1,Object o2){
   double price1=((Product)o1).price;
   double price2=((Product)o2).price;
   if (price1==price2){
     return 0;
   }else if(price1>price2){
     return -1;
   }
   return 1;
 }
}

 

コンパイルして実行した後の出力:

 

7.6
4.0
3.7
3.6
3.4

wxで「プログラマーコアラ」を検索し、Javaの分野に焦点を合わせてください。

元の13件の記事を公開 いいね2 訪問数576

おすすめ

転載: blog.csdn.net/weixin_40273144/article/details/105659023