ベクタ:線形リスト

  1. 目的
    配列では、あらかじめ確保した個数しか記録できません。Vectorクラスはデータをリストで接続した線形リストによるデータ構造としてよく利用されています。

  2. 利用法

    1. 利用法
      まず、ベクタクラスのオブジェクトを定義します。
       Vector v1=new Vector();
      newで生成した任意のオブジェクトを次のようにベクタに登録します。ここでは、Point クラスを登録しています。
          Point p1=new Point(i,i);
          v1.add(p1);
      登録した要素は、登録順に 0から番号がつきます。i 番目の要素を取り出すには、get(i) が利用できます。
       Point p=(Point)(v1.get(i));
      ベクタのサイズは、v1.size() で取り出すことができますから、つぎのようにベクタの要素を巡回できます。
          for(int i=0;i<v1.size();i++){
            Point p=(Point)(v1.get(i));
            System.out.println("p="+p);
          }

    2. Enumerationクラス
       ベクタの要素を効率的に取り出すにはEnumerationクラスを利用します。
      ベクタv1に対し、
       Enumeration em=v1.elements();
      で、Enumeration クラスの em を作成します。
       このemから、em.nextElement() で、次の要素を取り出すことができます。hasMoreElements() で要素の有無を知ることができますから、次のような繰返しでベクタの要素を巡回できます。この方が、v1.get(i) による方法より高速です。
        while(em.hasMoreElements()){
           Integer pj=(Integer)(em.nextElement());
           sum=sum+pj.intValue();
       }

    3. 削除
       削除するには、番号を指定して remove(番号) で削除します。Enumeration クラスで巡回している場合、取り出したオブジェクトを指定して削除をすることができます。
       remove( Object obj)
      を利用します。

    4. 基本型の利用
       Hashtable で登録できるには、Object に限定されます。したがって、整数や少数派そのままでは保存できません。必要なら、Integerクラスのオブジェクトを生成し、これを保存します。
       
        Integer p1=new Integer(i);
       v1.add(p1);

       ベクタから値を取り出すときは、(Integer)でクラス指定をし、pj.intValue() で整数の値を取り出します。
          Integer pj=(Integer)(v1.get(i));
          sum=sum+pj.intValue();
    5. 注意
       ここでは、add() 以外は、番号を指定して取り出す、削除する方法を紹介しましたが、これは効率的な方法ではありません。ドキュメントを調べて、番号付けをしない方法を考えてください、

  3. プログラム
    1. プログラム
      クラスPointと基本型Integerをベクタに記録する例を紹介します。ベクタの取り出し法も2種類の方法を利用していますが、順に取り出す場合、Enumeration による方法の方がはるかに効率的です。
      import java.awt.Point;
      import java.util.*;
      
      public class ExVector {
        public static void main(String[] args) {
          Vector v1=new Vector();
          //ベクタ保存
          for(int i=0;i<4;i++){
            Point p1=new Point(i,i);
            v1.add(p1);
          }
          //ベクタ読み出し
          for(int i=0;i<v1.size();i++){
            Point p=(Point)(v1.get(i));
            System.out.println("p="+p);
          }
          v1.remove(2);
          System.out.println(v1);
          v1.removeAllElements();
              
          //基本クラス保存
          for(int i=0;i<4;i++){
            Integer p1=new Integer(i);
            v1.add(p1);
          }
          
          System.out.println(v1);
          //読み出し
          int sum=0;
          Enumeration em=v1.elements();
          while(em.hasMoreElements()){
            Integer pj=(Integer)(em.nextElement());
            sum=sum+pj.intValue();
          }
          System.out.println("sum="+sum);
      
        }
      }

    2. 実行結果

      p=java.awt.Point[x=0,y=0]
      p=java.awt.Point[x=1,y=1]
      p=java.awt.Point[x=2,y=2]
      p=java.awt.Point[x=3,y=3]
      [java.awt.Point[x=0,y=0], java.awt.Point[x=1,y=1], java.awt.Point[x=3,y=3]]
      [0, 1, 2, 3]
      sum=6