Java Set コレクションの走査と実装クラスの比較 (コード付き)

黄舟
リリース: 2017-03-30 10:24:49
オリジナル
1606 人が閲覧しました

この記事では、主に Java Setコレクションの走査と実装クラスの比較に関する情報を紹介します。必要な方は、

Java Set コレクションの走査と実装クラスの比較

Java の Set コレクションを参照してください。繰り返しの要素を含まないコレクション まずはトラバーサルメソッドを見てみましょう

package com.sort; 
 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 
 
/** 
 * 一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2, 
 * @author Owner 
 * 
 */ 
public class SetTest2 { 
 
  public static void main(String[] args) { 
    Set<String> set = new HashSet<String>(); 
     
    set.add("a"); 
    set.add("b"); 
    set.add("c"); 
    set.add("d"); 
    set.add("e"); 
     
    set.add("e");//不能放入重复数据 
     
    /** 
     * 遍历方法一,迭代遍历 
     */ 
    for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ 
      System.out.print(iterator.next()+" "); 
    } 
     
    System.out.println(); 
    System.out.println("********************"); 
     
    /** 
     * for增强循环遍历 
     */ 
    for(String value : set){ 
      System.out.print(value+" "); 
    } 
  } 
}
ログイン後にコピー

注: ここで Set コレクションに入れるのは String 型です。 などの独自定義のクラス インスタンスを入れるとします。 Person クラスのインスタンス。現時点では、ハッシュコードとイコール メソッドを自分で書き直す必要があります。独自のキー フィールドで書き換えます。これは、HashSet を使用する場合、hashCode() メソッドが呼び出されて、 のハッシュ コードを決定するためです。セットに格納されているオブジェクト。値が追加されたオブジェクトのハッシュ コード値と一致するかどうかを確認します。一致しない場合は、equals メソッドと比較します。 true を返す場合、オブジェクトが追加され、新しいオブジェクトは追加されません。それ以外の場合は追加されます。

Set コレクションのもう 1 つの重要な実装クラス、TreeSet を分析してみましょう。

TreeSet は、要素の 自然な順序 を使用して要素を並べ替えるか、 の作成時に提供された Comparator に従って並べ替えます。使用される工法

平たく言えば、並べ替えられたリストで表示することも、指定されたルールに従って並べ替えることもできます

Set<String> set = new TreeSet<String>(); 
     
    set.add("f"); 
    set.add("a"); 
    set.add("b"); 
    set.add("c"); 
    set.add("d"); 
    set.add("e"); 
     
    System.out.println(set);
ログイン後にコピー

出力: [a, b, c, d, e, f]

後の出力並べ替え

それでは、逆の順序で出力したい場合はどうすればよいでしょうか?もちろん、方法はたくさんあります。ここで、逆の順序で出力させるルールを指定します

package com.sort; 
 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.TreeSet; 
 
public class TreeSetTest3 { 
 
  public static void main(String[] args) { 
    Set<String> set = new TreeSet<String>(new MyComparator()); 
     
    set.add("a"); 
    set.add("b"); 
    set.add("c"); 
    set.add("d"); 
    set.add("e"); 
    set.add("A"); 
     
    for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ 
      System.out.print(iterator.next()+" "); 
    } 
  } 
} 
 
class MyComparator implements Comparator<String>{ 
 
  @Override 
  public int compare(String o1, String o2) { 
     
    return o2.compareTo(o1);//降序排列 
  }
ログイン後にコピー

出力: e d c b a A

Set コレクションに自分で定義したクラス型を配置した場合はどうなるでしょうか?

注: 上記のメソッドと同様に、Comparatorインターフェースを実装する並べ替えルール クラスを必ず定義してください

package com.sort; 
 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.TreeSet; 
 
public class TreeSetTest2 { 
 
  public static void main(String[] args) { 
    Set<Person> set = new TreeSet<Person>(new PersonComparator()); 
     
    Person p1 = new Person(10); 
    Person p2 = new Person(20); 
    Person p3 = new Person(30); 
    Person p4 = new Person(40); 
     
    set.add(p1); 
    set.add(p2); 
    set.add(p3); 
    set.add(p4); 
     
    for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){ 
      System.out.print(iterator.next().score+" "); 
    } 
  } 
} 
 
class Person{ 
  int score; 
   
  public Person(int score){ 
    this.score = score; 
  } 
   
  public String toString(){ 
    return String.valueOf(this.score); 
  } 
} 
 
class PersonComparator implements Comparator<Person>{ 
 
  @Override 
  public int compare(Person o1, Person o2) { 
     
    return o1.score - o2.score; 
  } 
   
}
ログイン後にコピー

出力: 10 20 30 40

人のスコアの逆順に並べ替えると、比較メソッド o2.score-o1.score

を変更するだけで済みます。

以上がJava Set コレクションの走査と実装クラスの比較 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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