TreeSetおよびストレージカスタムクラス書き換えcompareTo()
5945 ワード
TreeSet:エレメントが昇順、デフォルトでは自然な順序で配置されている順序付きの集合です.つまり、TreeSetのオブジェクトエレメントはComparableインタフェースを実装する必要があります.
実装原理:赤と黒の木は、親ノードより小さいものを左に、親ノードより大きいものを右に、同じように1つだけ格納し、連続する3つの要素が分岐していない場合、自動的に中間要素をノードとして使用します.これにより、比較回数が減少し、ソート効率が向上します.
TreeSetはカスタムクラスを格納します:TreeSetを使用してカスタムクラスを格納する場合、カスタムクラスでcompareToメソッドを書き換える必要があります.比較形式を提供します.TreeSetではユーザーがカスタマイズしたタイプを正確にツリーソートできません.
例は次のとおりです.まず学生クラスをカスタマイズします.
書き換えたcompareTo()は次のとおりです.
TreeSet注意事項:TreeSet注意事項:*1、TreeSetに元素を添加する際、元素が自然順序の特性を備えている場合は、元素の自然順序の特性に従って村粗を並べ替える.*2、TreeSetに要素を追加する場合、要素が自然な順序の特性を備えていない場合、その要素が属するクラスはComparableインタフェースを実現し、要素の比較規則をcompareTo(T o)メソッドに定義しなければならない.*3、要素を比較する場合、compareToメソッドは0を返し、その要素は重複要素と見なされ、追加は許されない(注意:TreeSetとhashCode、equalsメソッドには何の関係もない)
出力結果は、Students[stuNo=102,stuName=王五,score=93]Students[stuNo=103,stuName=趙六,score=89]Students[stuNo=104,stuName=韓七,score=89]Students[stuNo=101,stuName=李四,score=67]Students[stuNo=100,stuName=張三,score=58]
実装原理:赤と黒の木は、親ノードより小さいものを左に、親ノードより大きいものを右に、同じように1つだけ格納し、連続する3つの要素が分岐していない場合、自動的に中間要素をノードとして使用します.これにより、比較回数が減少し、ソート効率が向上します.
TreeSetはカスタムクラスを格納します:TreeSetを使用してカスタムクラスを格納する場合、カスタムクラスでcompareToメソッドを書き換える必要があります.比較形式を提供します.TreeSetではユーザーがカスタマイズしたタイプを正確にツリーソートできません.
例は次のとおりです.まず学生クラスをカスタマイズします.
package com.zzu.java13.treeset;
public class Students implements Comparable{
String stuNo ;
String stuName;
int score;
public Students(String stuNo, String stuName, int score) {
super();
this.stuNo = stuNo;
this.stuName = stuName;
this.score = score;
}
@Override
public String toString() {
return "Students [stuNo=" + stuNo + ", stuName=" + stuName + ", score=" + score + "]";
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(Students stu) {
if(stu!=null){
if(score == stu.score){
return stuNo.compareTo(stu.stuNo);
}
return score - stu.score;
}
return 0;
}
}
書き換えたcompareTo()は次のとおりです.
public int compareTo(Students stu) {
if(stu!=null){
if(score == stu.score){
return stuNo.compareTo(stu.stuNo);
}
return score - stu.score;
}
return 0;
}
TreeSet注意事項:TreeSet注意事項:*1、TreeSetに元素を添加する際、元素が自然順序の特性を備えている場合は、元素の自然順序の特性に従って村粗を並べ替える.*2、TreeSetに要素を追加する場合、要素が自然な順序の特性を備えていない場合、その要素が属するクラスはComparableインタフェースを実現し、要素の比較規則をcompareTo(T o)メソッドに定義しなければならない.*3、要素を比較する場合、compareToメソッドは0を返し、その要素は重複要素と見なされ、追加は許されない(注意:TreeSetとhashCode、equalsメソッドには何の関係もない)
public class TreeSetDemo {
public static void main(String[] args) {
Set treeset = new TreeSet();
treeset.add(new Students("100"," ",58));
treeset.add(new Students("101"," ",67));
treeset.add(new Students("102"," ",93));
treeset.add(new Students("103"," ",89));
treeset.add(new Students("104"," ",89));
for(Students stu:treeset){
System.out.println(stu);
}
}
}
出力結果は、Students[stuNo=102,stuName=王五,score=93]Students[stuNo=103,stuName=趙六,score=89]Students[stuNo=104,stuName=韓七,score=89]Students[stuNo=101,stuName=李四,score=67]Students[stuNo=100,stuName=張三,score=58]