セット

重複を許さないデータの集合を格納するために用いる.インスタンス化可能なコレクションとして,TreeSetやHashSetなどがある. TreeSetは,順番にソートされた状態で格納され,HashSetは順番が約束されない.

import java.util.HashSet;
import java.util.Iterator;
public class Main
{
    public static void main(String args[])
    {
        HashSet<String> animalSet = new HashSet<String>();
        animalSet.add("きりん");
        animalSet.add("ぞう");
        animalSet.add("らいおん");
        animalSet.add("ぞう");
        animalSet.add("さい");
        Iterator<String> it = animalSet.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}
ぞう
さい
きりん
らいおん

ここで注目したいのは,コレクション反復子である.配列のように単純に連続したデータであれば,インデックスを指定して,取り出すことができるが,Setの場合には,重複したデータをのぞく操作や,データの配置などの結果,番号による呼び出しが困難である.そのため,何らかの順序で呼び出さなければならない.その取り出し方を介するのが,Iterableインターフェースである.

import java.util.Iterator;
import java.util.TreeSet;
public class Main
{
    public static void main(String args[])
    {
        TreeSet<String> animalSet = new TreeSet<String>();
        animalSet.add("きりん");
        animalSet.add("ぞう");
        animalSet.add("らいおん");
        animalSet.add("ぞう");
        animalSet.add("さい");
        Iterator<String> it = animalSet.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}
きりん
さい
ぞう
らいおん

TreeSetでの順番は,そのままでは自然順序付けであるので,数字の昇順や,50音順などになる.しかし,こちらで任意の順番を指定したい場合には,TreeSetをインスタンスするときに,順番を決めるオブジェクトを設定する. 例えば,要素がクラスであるときにも,順番を指定することができる.

以下の例では,Animalクラスを要素とするTreeSetを作るとき,その並び順は,Animalクラスのweight(平均体重)を元にしている.そのために,Comparatorインターフェースを実装したクラスのインスタンスをTreeSetの引数として渡すことで,任意の順番で自動的に並び替えてくれるコレクションを設定することができる.

package treeset;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Main
{
   public static void main(String args[])
  {
    TreeSet<Animal> animalSet = new TreeSet<Animal>(new AnimalComparator());
    animalSet.add(new Animal(1100,"きりん"));
    animalSet.add(new Animal(7000,"ぞう"));
    animalSet.add(new Animal(200,"らいおん"));
    animalSet.add(new Animal(7000,"ぞう"));
    animalSet.add(new Animal(2300,"さい"));
    Iterator<Animal> it = animalSet.iterator();
    while(it.hasNext())
    {
      Animal thisAnimal = it.next();
      System.out.println(thisAnimal.getWeight() + ":" + thisAnimal.getName());
    }
  }
}
class Animal
{
  private int weight;
  private String name;
  public Animal(int weight, String name)
  {
    this.weight = weight;
    this.name = name;
  }
  public int getWeight()
  {
    return weight;
  }
  public String getName()
  {
    return name;
  }
}
class AnimalComparator implements Comparator<Animal>
{
  @Override
  public int compare(Animal animal1, Animal animal2)
  {
    if(animal1.getWeight() > animal2.getWeight())
    {
      return 1;
    }
    else if(animal1.getWeight() == animal2.getWeight())
    {
      return 0;
    }
    else
    {
      return -1;
    }
  }
}
200:らいおん
1100:きりん
2300:さい
7000:ぞう