TreeSetコレクションの機能
-
要素は順序付けられています。ここでの順序は、保存と取得の順序ではなく、特定のルールに従って並べ替えられます。具体的な並べ替え方法は、構築方法によって異なります。
-
TreeSet():要素の自然な順序に従って並べ替えます
-
TreeSet(コンパレータコンパレータ):指定されたコンパレータに従ってソートします
-
インデックス付きのメソッドがないため、通常のforループを使用してトラバースすることはできません
-
Setコレクションであるため、繰り返される要素のコレクションは含まれていません。
コードの一部を見てください:
package Set;
import java.util.TreeSet;
public class TreeSetDemo01 {
public static void main(String[] args) {
//集合创建要使用引用,即包装类
TreeSet<Integer> ts=new TreeSet<>();
//自然排序
ts.add(20);
ts.add(40);
ts.add(30);
ts.add(10);
ts.add(30);
for(Integer i:ts) {
//输出10 20 30 40
System.out.println(i);
}
}
}
セットに20、40、30、10、30を追加し、最後に10 20 30 40を出力し、自然な順序で出力します。
自然順
ケースを見てみましょう:
学生のオブジェクトを保存してトラバースし、引数なしの構築方法を使用してコレクションを作成します。
要件:若いものから古いものへと年齢で並べ替えます。年齢が同じ場合は、名前のアルファベット順に並べ替えます。
まず、学生クラスを作成します。
package Set;
public class student implements Comparable<student>{
private String name;
private int age;
//构造方法
public student() {
System.out.println("无参构造");
}
public student(String name,int age) {
this.name=name;
this.age=age;
}
//提供get/set方法
public void setAge(int age) {
if(age<0||age>100)
{
System.out.println("年龄有误");
}else {
this.age=age;
}
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name+","+age);
}
@Override
public int compareTo(student s) {
//return 0;//重复元素,不添加
//return 1;//按照输入升序排序
//return -1;//按照输入逆序排序
int num=this.age-s.age;//年龄升序 this为s2,s为s1
//int num=s.age-this.age;//降序
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
}
自然な順序付けとは、要素が属するクラスがComparableインターフェイスを実装し、compareTo(To)メソッドをオーバーライドすることを意味します。
- 0を返します; //要素を繰り返します。追加しないでください
- 1を返します; //入力の昇順で並べ替えます
- -1を返します; //入力の逆順に従ってソートします
次のコード行は、2人が同じ年齢であるかどうかを判断し、名前を比較します。これは、StringがcompareToの書き直しであるため、直接使用できるためです。
int num2=num==0?this.name.compareTo(s.name):num;
@Override
public int compareTo(student s) {
//return 0;//重复元素,不添加
//return 1;//按照输入升序排序
//return -1;//按照输入逆序排序
int num=this.age-s.age;//年龄升序 this为s2,s为s1
//int num=s.age-this.age;//降序
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
メイン:
package Set;
import java.util.TreeSet;
public class TreeSetDemo02 {
public static void main(String[] args) {
//集合创建要使用引用,即包装类
TreeSet<student> ts=new TreeSet<>();
student s1=new student("小李",20);
student s2=new student("小李",50);
student s3=new student("小张",35);
student s4=new student("小王",18);
student s5=new student("小康",35);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(student s:ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}
指定されたコンパレータソート
ケースを直接見てください:
学生のオブジェクトを保存してトラバースし、パラメータを使用して構築方法を使用してコレクションを作成します
*要件:年齢が若いものから古いものへと並べ替え、年齢が同じ場合は、名前のアルファベット順に並べ替えます
コンパレータのソートに応じて、クラスにComparatorインターフェイスを実装する必要があります。
ここでは、匿名内部クラスを直接使用してComparatorインターフェイスを実装します。
学生カテゴリー:
package Set;
public class student03{
private String name;
private int age;
//构造方法
public student03() {
System.out.println("无参构造");
}
public student03(String name,int age) {
this.name=name;
this.age=age;
}
//提供get/set方法
public void setAge(int age) {
if(age<0||age>100)
{
System.out.println("年龄有误");
}else {
this.age=age;
}
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name+","+age);
}
}
メイン:
package Set;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo03 {
public static void main(String[] args) {
TreeSet<student03> ts=new TreeSet<student03>(new Comparator<student03>() {
@Override
public int compare(student03 s1,student03 s2) {
//匿名内部类实现Comparator接口
//this.age-s.age
//s1 s2
int num=s1.getAge()-s2.getAge();
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
student03 s1=new student03("小李",20);
student03 s2=new student03("小李",50);
student03 s3=new student03("小张",35);
student03 s4=new student03("小王",18);
student03 s5=new student03("小康",35);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(student03 s:ts) {
System.out.println(s.getName()+","+s.getAge());
}
}
}