Comparable と Comparator を使用して Java で並べ替えを削除する方法

王林
リリース: 2023-05-11 15:43:06
転載
915 人が閲覧しました

1. 並べ替えと重複排除

日常の作業では、結果セットの何らかのフィルター処理が必要なシナリオが常に存在します。たとえば、サードパーティとの対話後に取得した結果セットを再度並べ替えて重複排除する必要がある場合、結果セットは特定のフィールドに従って重複排除されるか、特定のフィールドによって並べ替えられます。

Java では、重複を削除する場合、Set (順序なし、重複なし) の特性を簡単に考えることができ、TreeSet (順序あり、重複なし) で重複排除のルールを指定することもできます (通常は重複排除後)。は結果セットを昇順で示します)。

ソートというと、さまざまなソート アルゴリズムが簡単に思いつきますが、Java ではコレクションの sort() メソッドなどのソート関数がすでに提供されており、ソート フィールドや昇順、降順を指定することもできます。注文。

ここでもう 1 つ言わせてください、Set の特性 (順序なし、重複なし):

  • 無秩序: 無秩序はランダムではありません, セットに配置された要素は、要素のハッシュ値に応じて位置が決定されるため、

  • #重みなし: 要素を追加する場合、要素のハッシュ値に応じて判断されます。要素のequals()。falseは、2つの要素が等しくないと判断した場合にのみ追加されます。

2. ComparableとComparatorの使用

public class CompareTest {

    public static void main(String[] args) {
        // 例如:从第三方返回的结果集
        // 根据id去重,根据createTime降序排列
        String result = "["
                + "{ \"id\": 1, \"createTime\": \"2022-12-21 13:23:59\"}"
                + "{ \"id\": 2, \"createTime\": \"2022-11-11 12:43:01\"}"
                + "{ \"id\": 1, \"createTime\": \"2022-12-21 11:20:50\"}"
                + "{ \"id\": 3, \"createTime\": \"2023-01-01 14:30:00\"}"
                + "]";
        JSONArray examList = JSONArray.parseArray(result);
        System.out.println("初始数据集:" + examList);

        // 去重,利用set特性
        Comparator<JSONObject> comparator = (a, b) -> Integer.compare(a.getIntValue("id"), b.getIntValue("id"));
        Set<JSONObject> set = new TreeSet<>(comparator);
        examList.forEach(jo -> set.add((JSONObject) jo));
        // 此时的结果是,根据id去重,并且是升序的结果(自然排序)
        System.out.println("去重结果:" + set);

        // 此处为了,方便演示Comparable接口的作用,故把JSON映射成实体类,进行实现接口排序,其实sorted也可以使用Comparator排序
        List<ExamInfo> collect = set.stream()
                .map(jo -> JSONObject.toJavaObject(jo, ExamInfo.class))
                .sorted()
                .collect(Collectors.toList());
        System.out.println("指定排序结果:" + collect);
    }

}
ログイン後にコピー
public class ExamInfo implements Comparable<ExamInfo> {

    private int id;
    private String createTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "ExamInfo{" +
                "id=" + id +
                ", createTime=&#39;" + createTime + &#39;\&#39;&#39; +
                &#39;}&#39;;
    }

    @Override
    public int compareTo(ExamInfo o) {
        // 降序
        return o.getCreateTime().compareTo(this.createTime);
    }
}
ログイン後にコピー

Comparable と Comparator を使用して Java で並べ替えを削除する方法

昇順ソートと降順ソートの問題については、Comparable と Comparator の比較メソッドの戻り値が 0 より大きい場合に交換されます。

パラメータの順序が a, b の場合:

  • If

    a>b、つまり a-b>0 、交換後の順序は a、b なので、b が前、a が後ろになるため、ソート順は 昇順 となり、自然なソートです。

     // 升序
     Comparator<JSONObject> comparator = (a, b) -> Integer.compare(a.getIntValue("id"), b.getIntValue("id"));
    ログイン後にコピー

b>a
    の場合、つまり、b-a>0 の順序は a, b です。交換後、b が前、a が後ろになります。戻り、並べ替え順序は
  • 降順

    です。

     	@Override
     	public int compareTo(ExamInfo o) {
            // 降序
            return o.getCreateTime().compareTo(this.createTime);
        }
    ログイン後にコピー
    3. 違い

    ##比較可能java.langjava.util が含まれるパッケージ関数インターフェイス は です 比較メソッド int CompareTo(T o) int Compare (T o1, T o2)使用シナリオ比較対象のオブジェクトは自分で変更できます比較対象のオブジェクトは自分で変更できません。または、オブジェクトは Comparable インターフェイスを実装していますが、比較ルールは適用されません
    コンパレータ

    以上がComparable と Comparator を使用して Java で並べ替えを削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート