關於在TreeSet中新增自定義類 報ClassCastException的解決方法
一、先來看一下TreeSet的繼承結構和類宣告形式
繼承結構:
java.lang.Object
|_ java.util.AbstractCollection<E>
|_ java.util.AbstractSet<E>
|_ java.util.TreeSet<E>
類宣告:
public class TreeSet<E>
extends AbstractSet<E>
implements SortedSet<E>, Cloneable, java.io.Serializable //它實現了sortedSet,有排序的功能
二、TreeSet的主要性質
1、TreeSet中不能有重複的元素;
2、TreeSet具有排序功能;
3、TreeSet中的元素必須實現Comparable介面並重寫compareTo()方法,TreeSet判斷元素是否重複、以及確定元素的順序靠的都是這個方法;(這條性質比較重要,如果讀者對TreeSet內部機制比較熟悉的話這條性質應該不難理解;如果讀者不太理解的話可以參看以下這篇文章http://wlh269.javaeye.com/blog/376430)
4、對於java類庫中定義的類,TreeSet可以直接對其進行儲存,如String,Integer等(因為這些類已經實現了Comparable介面);
5、對於自定義類,如果不做適當的處理,TreeSet中只能儲存一個該型別的物件例項,請看程式示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
tSet.add(d1);
tSet.add(d2);//如果有這條語句,執行程式時會丟擲ClassCastException異常
//如果沒有這條語句,程式會正常執行,並輸出d1的內容
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);
System.out.println();
}
}
}
class Demo{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
}
三、在TreeSet中儲存自定義類的實現方法
示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
Demo d1=new Demo(1,"abc");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意此程式執行時會輸出幾個元素
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a>demo.a){
return 1;
}else if(this.a<demo.a){
return -1;
}else{
return 0;
}
}
}
解析:上面程式會輸出兩個元素,並且是以a為判斷標準按序輸出的。當呼叫TreeSet的add()方法時,在TreeSet的內部會間接呼叫Demo的compareTo()方法、然後和TreeSet中已經存在的其他元素一一進行比較,在比較的過程中完成“判斷是否重複”以及“排序”的功能:當在某次比較的過程中發現compareTo()返回0,就會認為待加入的元素已經存在於TreeSet中,返回-1或1的話就會根據TreeSet預設的比較器進行排序。
下面對程式進行修改,重寫compareTo()方法,讓TreeSet以a和b兩個屬性為依據來判斷元素是否重複以及元素的順序,請看下面的示例:
import java.util.*;
public class TreeSetDemo{
public static void main(String args[]){
TreeSet<Demo> tSet=new TreeSet<Demo>();
Demo d1=new Demo(1,"abc");
Demo d2=new Demo(2,"xyz");
Demo d3=new Demo(2,"uvw");
tSet.add(d1);
tSet.add(d2);
tSet.add(d3);
Iterator itr=tSet.iterator();
while(itr.hasNext()){
Demo d=(Demo)itr.next();
System.out.print(d.a+" "+d.b);//注意這次輸出的元素個數
System.out.println();
}
}
}
class Demo implements Comparable{
int a;
String b;
public Demo(int a,String b){
this.a=a;
this.b=b;
}
public int compareTo(Object o){
Demo demo=(Demo)o;
if(this.a==demo.a&&this.b.equals(demo.b)){
return 0;
}else if(this.a>demo.a){
return 1;
}else {
return -1;
}
}
}
解析:這次改動了compareTo()方法,程式輸出了三個元素d1,d2和d3;當我們自己定義類,並且需要將自定義的類存到TreeSet中的時候,需要認真考慮compareTo的定義方式即需要認真考慮實際應用中依據什麼判斷元素是否重複和元素的順序。
轉載自lubiaopanlubiaopan的csdn部落格 測試通過程式沒有問題 這裡表示感謝
相關文章
- WebService中使用自定義類的解決方法(5種)Web
- Hadoop中java.lang.ClassCastException: partition解決方法HadoopJavaASTException
- 在Luminar 4中向天空新增自定義物件物件
- JiaThis自定義新增分享媒體的方法
- 關於vb自定義控制元件中引用mediaplayer控制元件出錯的解決方案控制元件
- 關於自定義 Alert
- 關於在oracle 的group by中使用自定義函式Oracle函式
- 修改帶 JAVA 自定義類的報表還要重啟應用,咋解決?Java
- 在Python中新增自定義模組Python
- 關於“類不能支援Automation操作”錯誤的解決方法
- Java中關於OOM的場景及解決方法JavaOOM
- H5自定義字型解決方法(mark)H5自定義字型
- 工具類——自定義Collections集合方法
- 關於RecyclerView.ItemDecoration的自定義View
- 在VC++中建立自定義資料庫類 (轉)C++資料庫
- Java中關於OOM的場景及解決方法(轉)JavaOOM
- 為Autodesk Viewer新增自定義工具條的更好方法View
- 關於自定義標籤庫
- 【iOS】關於 UICollectionView 的自定義佈局iOSUIView
- Laravel 不在模型中定義關聯關係的解決方法(拒絕背鍋)Laravel模型
- WCF中關於HttpContext.Current為空的解決方法HTTPContext
- robotframework appiumLibrary新增自定義關鍵字FrameworkAPP
- Spring Boot 中關於自定義異常處理的套路!Spring Boot
- VB.NET中關於DataGrid顏色的自定義。 (轉)
- Java中的註解-自定義註解Java
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- js中關於定義類的幾種方式介紹JS
- 關於外部引用jar包報紅無法使用解決方法JAR
- C#中自定義異常類C#
- 【譯】如何自定義Flask中的響應類Flask
- 在Laravel 中如何自定義servicesLaravel
- onethink自定義模型關聯表的解決方法不知道是不是走了彎路,模型
- 關於C++類的定義和物件的建立詳解C++物件
- 關於在頁面中解決列印的幾個問題 (轉)
- 關於OCLint自定義規則
- 關於自定義View的drawText字型測量View
- 關於自定義程式的效能最佳化
- spring mvc中關於url中傳遞中文亂碼的解決方法SpringMVC