* TreeSet:
隆德網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),隆德網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為隆德近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的隆德做網(wǎng)站的公司定做!
* 1.向TreeSet中添加的元素必須是同一個(gè)類的。
* 2.可以按照添加進(jìn)集合中的元素的指定的順序遍歷。像String、包裝類等默認(rèn)按照從小到大的順序遍歷。
* 3.自然排序:當(dāng)向TreeSet中添加自定義類的對(duì)象時(shí),有兩種排序方法:①自然排序 ②定制排序
* 4.自然排序:要求自定義類實(shí)現(xiàn)java.lang.Comparable接口并重寫其compareTo(Object obj)
* 在此方法中,指明按照自定義類的哪個(gè)屬性來排序。
*
* 5.向TreeSet中添加元素時(shí),首先按照compareTo()進(jìn)行比較,一旦返回0,雖然僅是兩個(gè)對(duì)象的
* 此屬性值相同,但是程序會(huì)認(rèn)為這兩個(gè)對(duì)象是相同的,進(jìn)而后一個(gè)對(duì)象就不能添加進(jìn)來。
*
* compareTo()與hashCode()以及equals()三者保持一致!
*
用Collections.sort就可以排序,
里面的排序是默認(rèn)的按自然順序排列
也就是1,2,3,4這種
參數(shù)要求實(shí)現(xiàn)了Comparable的數(shù)據(jù)才能排序,
如果你自己寫的類,你就要實(shí)現(xiàn)Comparable接口,然后在接口里面自動(dòng)生成的方法里面
指定排序方法,一般的String Inteneger類都是實(shí)現(xiàn)了這個(gè)接口的 不用自己操作的。
你可以取看源代碼
答案:java中所有類的排序是根據(jù)該類中的toString方法來排序的,你可以通過查看String類的底層代碼找到其toString()方法來看他是如何排序的。這是原理
對(duì)于單獨(dú)這個(gè)問題:字符串排序時(shí)根據(jù)字符串第一個(gè)字符的按照自然順序排序
自然順序:例如如果第一個(gè)是數(shù)字,則按照從小到大排序,如果第一個(gè)字符相同則再比較第二個(gè)字符
以此類推,對(duì)于字母則根據(jù)26個(gè)英文字母的順序決定。
=======================如果是你想問的請(qǐng)給最佳回答,有不懂得可以追問==========謝謝。
學(xué)生實(shí)體類,包含姓名和年齡屬性,
比較時(shí)先按姓名升序排序,如果姓名相同則按年齡升序排序。
第一種:實(shí)體類自己實(shí)現(xiàn)比較
(實(shí)現(xiàn)comparable接口:public interface ComparableT ,里面就一個(gè)方法聲明:public int compareTo(T o); )
然后利用List類的sort(Comparator? super E c)方法或java.util.Collections工具類的sort(ListT list) (其實(shí)里面就一句:list.sort(null); )進(jìn)行排序:
結(jié)果:
第二種:借助比較器進(jìn)行排序。
示例代碼:
比較器java.util.Comparator類是一個(gè)接口(public interface ComparatorT ),包含int compare(T o1, T o2);等方法:
我們的比較器要實(shí)現(xiàn)該接口并實(shí)現(xiàn)compare方法:
比較的時(shí)候可以利用List的sort(Comparator? super E c)方法(或者java.util.Collections工具類的sort(ListT list, Comparator? super T c)方法)進(jìn)行排序。
結(jié)果跟第一種方法一樣:
import?java.util.Comparator;
import?java.util.TreeSet;
/*
*?需求:請(qǐng)按照姓名的長(zhǎng)度排序
*?
*?TreeSet集合保證元素排序和唯一性的原理
*?唯一性:是根據(jù)比較的返回是否是0來決定。
*?排序:
*? A:自然排序(元素具備比較性)
*? 讓元素所屬的類實(shí)現(xiàn)自然排序接口?Comparable
*? B:比較器排序(集合具備比較性)
*? 讓集合的構(gòu)造方法接收一個(gè)比較器接口的子類對(duì)象?Comparator
*/
public?class?TreeSetDemo?{
public?static?void?main(String[]?args)?{
//?創(chuàng)建集合對(duì)象
//?TreeSetStudent?ts?=?new?TreeSetStudent();?//自然排序
//?public?TreeSet(Comparator?comparator)?//比較器排序
//?TreeSetStudent?ts?=?new?TreeSetStudent(new?MyComparator());
//?如果一個(gè)方法的參數(shù)是接口,那么真正要的是接口的實(shí)現(xiàn)類的對(duì)象
//?而匿名內(nèi)部類就可以實(shí)現(xiàn)這個(gè)東西
TreeSetStudent?ts?=?new?TreeSetStudent(new?ComparatorStudent()?{
@Override
public?int?compare(Student?s1,?Student?s2)?{
//?姓名長(zhǎng)度
int?num?=?s1.getName().length()?-?s2.getName().length();
//?姓名內(nèi)容
int?num2?=?num?==?0???s1.getName().compareTo(s2.getName())
:?num;
//?年齡
int?num3?=?num2?==?0???s1.getAge()?-?s2.getAge()?:?num2;
return?num3;
}
});
//?創(chuàng)建元素
Student?s1?=?new?Student("linqingxia",?27);
Student?s2?=?new?Student("zhangguorong",?29);
Student?s3?=?new?Student("wanglihong",?23);
Student?s4?=?new?Student("linqingxia",?27);
Student?s5?=?new?Student("liushishi",?22);
Student?s6?=?new?Student("wuqilong",?40);
Student?s7?=?new?Student("fengqingy",?22);
Student?s8?=?new?Student("linqingxia",?29);
//?添加元素
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
ts.add(s8);
//?遍歷
for?(Student?s?:?ts)?{
System.out.println(s.getName()?+?"---"?+?s.getAge());
}
}
}