1.基于二叉树,不同步。
2. TreeSet 会对元素进行自然顺序排序
package day18;
import java.util.Iterator;
import java.util.TreeSet;
/**
* Created by zengjx on 2019/5/24.
*/
public class TreeSetDemo {
public static void main(String[] args){
treeSet1();
}
public static void treeSet1(){
TreeSet tree= new TreeSet();
tree.add("abc");
tree.add("ddd");
tree.add("ccc");
tree.add("aba");
Iterator it= tree.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
/**
* aba
abc
ccc
ddd
*/
}
}
3.对自定义对象进行排序。
自定义Person 类 ,默认是继承Object 类。 TreeSet 进行 add(new Person(" aaa",1)) ; 再次 add(new Person("bbb",2)) ;时候会进行强制排序。:会出现报错。
解决问题方法:Person implements Comparable,判断元素是否相同
TreeSet 不看HashCode 和equals ,只看comareTo返回值。
package day18;
import tree.Tree;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
* Created by zengjx on 2019/5/23.
*/
class Human {
String name ;
int age;
Human(String name,int age){
this.age=age;
this.name=name;
}
static class Comp implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Human human1=(Human)o1;
Human human2= (Human)o2;
int result= human1.age>human2.age ? 1:(human1.age==human2.age? 0:-1);
if(result==0){
result=human1.name.compareTo(human2.name);
}
return result;
}
}
}
class Person implements Comparable {
public String name;
public int age;
Person(String name,int age){
this.age=age;
this.name=name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public int compareTo(Object o) {
Person per=(Person)o;
//升序 比较对象与指定对象的顺序,如果该对象小于 等于或者大于指定对象分别返回负整数,零,正整数。
return this.age<per.age? -1: (this.age== per.age )? 0: 1;
//降序排列
// return this.age <per.age ?1:(this.age==per.age )? 0:-1;
}
}
public class TreeDemo1 {
public static void main(String[] args){
sortTest2();// sortTest();
}
public static void test1(){
TreeSet treeSet =new TreeSet();
treeSet.add(new Person("川普1",1));
treeSet.add(new Person("川普2",2));
treeSet.add(new Person("川普3",3));
treeSet.add(new Person("川普4",4));
Iterator iterator =treeSet.iterator();
while(iterator.hasNext()){
Person per=(Person)iterator.next();
System.out.println(" "+per.name+" "+per.age);
}
}
public static void test2(){
TreeSet treeSet =new TreeSet(new Human.Comp());
treeSet.add(new Human("特蕾莎1",1));
treeSet.add(new Human("特蕾莎2",2));
treeSet.add(new Human("特蕾莎3",3));
treeSet.add(new Human("特蕾莎4",4));
Iterator iterator =treeSet.iterator();
while(iterator.hasNext()){
Human human=(Human) iterator.next();
System.out.println(" "+human.name+" "+human.age);
}
}
public static void sortTest(){
String str="45, 46, 67, 78, -12";
String[] strArray=str.split(", "+"+");//ree
TreeSet treeSet =new TreeSet();
for(int i=0;i<strArray.length;i++){
treeSet.add( Integer.parseInt(strArray[i]));
}
Iterator iterator =treeSet.iterator();
while(iterator.hasNext()){
System.out.println(" "+iterator.next());
}
}
//使用Arrays.sort排序
public static void sortTest2(){
String str="45, 46, 67, 78, -12";
String[] strArray=str.split(", "+"+");//ree
int[] intArray= new int[strArray.length];
for(int i=0;i<intArray.length;i++){
intArray[i] = Integer.parseInt(strArray[i]);
}
Arrays.sort(intArray);
for(int i: intArray){
System.out.println("排序后"+i);
}
}
}
package day18; public class TreePerson implements Comparable{ String name; int age; TreePerson(String name,int age){ this.age=age; this.name=name; } //第一种 只是返回0 ,插入第一个元素后第二个元素开始调用 compareTo 进行比较返回 0所以后面元素都不会插入。 /* @Override public int compareTo(Object o) { return 0; //第一种 }*/ @Override public int compareTo(Object o) { TreePerson treePerson =(TreePerson)o; int temp=this.age-treePerson.age; System.out.println(" temp="+temp); System.out.println(" 当前对象"+this +" 传入对象"+treePerson); return temp; //第一种 } @Override public String toString() { return " this :"+this.name+" age "+this.age; } } /** * temp=0 * 当前对象 this :aaaa age 28 传入对象 this :aaaa age 28 * temp=-7 * 当前对象 this :bbbb age 21 传入对象 this :aaaa age 28 * temp=1 * 当前对象 this :ccccc age 29 传入对象 this :aaaa age 28 * temp=2 * 当前对象 this :cdddd age 30 传入对象 this :aaaa age 28 * temp=1 * 当前对象 this :cdddd age 30 传入对象 this :ccccc age 29 * temp=0 * 当前对象 this :aaa age 28 传入对象 this :aaaa age 28 * bbbb --21 * aaaa --28 * ccccc --29 * cdddd --30 */
练习2:按照字符串长度对字符串长度排序。
package day18; import java.util.Comparator; public class CompareByLength implements Comparator { @Override public int compare(Object o, Object t1) { String s1=(String) o; String s2=(String)t1; int temp= s1.length()-s2.length(); return temp ==0 ? (s1.compareTo(s2)) :temp;//这一一句是 如果字符串长度相同。 } }
//对字符串进行长度排序 public static void test2(){ TreeSet treeSet = new TreeSet(new CompareByLength()); treeSet.add("aaaa"); treeSet.add("aaab"); treeSet.add("qqqqqqqq"); treeSet.add("www"); treeSet.add("ddddddddddd"); Iterator iterator=treeSet.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
www
aaaa
aaab
qqqqqqqq
ddddddddddd