ホームページ  >  記事  >  Java  >  Java のセット コレクションを理解する方法

Java のセット コレクションを理解する方法

WBOY
WBOY転載
2022-06-20 11:31:051829ブラウズ

この記事では、java に関する関連知識を提供します。主にセット コレクションに関する関連問題を紹介します。セット コレクションの特徴は、不規則で、繰り返しがなく、インデックスがありません。以下は見てみましょう。それがみんなに役立つことを願っています。

Java のセット コレクションを理解する方法

推奨学習: 「java ビデオ チュートリアル

セット シリーズ コレクションの機能:

  • 無順序: アクセス順序が矛盾しています
  • 重複なし: 重複を削除できます
  • インデックスなし: インデックス付きメソッドがないため、通常のメソッドは削除できませんループトラバーサルの場合、要素はインデックスによって取得できません。

Set コレクション実装クラスの機能:

HashSet: 順序なし、重複なし、インデックスなし

LinkedHashSet:順序あり、重複なし、インデックスなし

TreeSet:並べ替え、重複なし、 No Index

Set コレクションの機能は基本的に Collection の API と同じです。

HashSet コレクション

HashSet コレクション:

Set<String> set = new HashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

出力結果:

上記のコードと実行結果から、HashSet コレクションが無秩序で反復していないことがはっきりとわかります;

上の図と組み合わせると、HashSet がコレクションはできません データは get() メソッドのインデックスを通じて取得されます。コレクション内のデータを削除する場合、データは対象を絞った方法でのみ削除できます。

LinkedHashSet コレクション:

LinkedHashSet コレクション:

Set<String> set = new LinkedHashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

出力結果:

Passed上記のコードと出力結果を比較すると、無秩序と順序の違いがわかります。前者は受信データの順序を乱しますが、後者は入力データの順序でデータを格納するため、出力時間は順調です。

TreeSet コレクション:

TreeSet コレクション:

Set<Integer> set = new TreeSet<>();
        set.add(13);
        set.add(23);
        set.add(23);
        set.add(11);
        System.out.println(set);
        set.remove(23);
        System.out.println(set);

出力結果:

合格上記のコードと出力結果から、TreeSet がソートを特徴とする理由、つまり、格納されたデータが Java のデフォルトのソート方法に従ってソートされる理由を文字通り理解できます。

ただし、この時点で People などのカスタム オブジェクトを格納すると、TreeSet を直接並べ替えることができず、エラーが発生します。

//People类:
public class People{
    private String name;
    private int age;
    private String classroom;

    public People(){

    }
    public People(String name, int age, String classroom) {
        this.name = name;
        this.age = age;
        this.classroom = classroom;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getClassroom() {
        return classroom;
    }

    public void setClassroom(String classroom) {
        this.classroom = classroom;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classroom='" + classroom + '\'' +
                '}';
    }
}
//main方法:
public static void main(String[] args) {
        Set<People> p = new TreeSet<>();
        p.add(new People("张三",19,"智能"));
        p.add(new People("李四",18,"数据库"));
        p.add(new People("王五",20,"渗透"));
        System.out.println(p);
    }

この問題を解決したい場合は、TreeSet コレクションのストレージの種類をカスタマイズする必要があります。この問題を解決するには 2 つの方法があります: 1 つは、実装するクラスをカスタマイズすることです。 Comparable インターフェイスと内部の CompareTo メソッドを書き換えてルールを指定します。もう 1 つのは、ルール定義用の独自のコンパレータ オブジェクトを持つコレクションです。

方法 1: カスタム クラスは Comparable インターフェイスを実装し、compareTo メソッドを書き換えて比較ルールを指定します (冗長で無関係なコードはここでは繰り返さず、コードの重要な部分のみを示します) ) )

//改变的第一个地方:实现Comparable类
public class People implements Comparable<People> {
//改变的第二个地方:重写Comparable类中的compareTo方法    
    @Override
    public int compareTo(People o) {
        return this.age-o.age;
    }
}
出力結果 (年齢に応じて比較):

オーバーライドされたメソッドでは、return 後のコードによってオブジェクトが何を処理するかが決まります。比較ルールは次のとおりです。

    最初の要素が 2 番目の要素より大きいとみなされる場合、正の整数を返すことができます。
  • 最初の要素が2 番目の要素より小さいと見なされます。負の整数を返してください。
  • 最初の要素が 2 番目の要素と等しいと思われる場合は、0 を返してください。現時点では、Treeset コレクションには 1 つの要素のみが保持されます。両方とも重複とみなされます

方法 2:コレクションにはルール定義用のコンパレータ オブジェクトが付属しています

Set<People> p = new TreeSet<>(new Comparator<People>() {
            @Override
            public int compare(People o1, People o2) {
                return o1.getAge()-o2.getAge();
            }
        });
元のベースに基づいてコレクションの作成を変更します。その比較基準は以前の定義方法と似ており、比較的以前の方法の方が便利で高速です。ここで、以前に学習した知識「ラムダ式」の一部を復習し、コード ブロックを簡略化することもできます。

Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());
ラムダ式を学習したことがない場合、またはラムダ式の知識が明確でない場合は、Java でラムダ式を理解する方法を参照してください。この記事の説明を簡略化すると、何か役に立つかもしれません。

推奨学習: 「Java ビデオ チュートリアル

以上がJava のセット コレクションを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。