プロが教えるわが家の防犯対策術!

下記の様に、Employeeの(クラス)型でキャストした場合の、EmployeeのVectorを使った書き方がよく分かりません。Employeeは複数の従業員の名前をVector形式で表現したものになります。Employeeクラスの中で、Vector型のEmployeeや関数print()をどうやって書いたらいいのか分かりかねています。御教示願えたらと思っています。

//ここから

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ

Traversable employees;
employees = new TraversableVector();
// ...
java.util.Enumeration e = employees.createEnumeration();
while(e.hasMoreElements()) {
Employee emp = (Employee)e.nextElement();
emp.print();
}

}

}

//ここまで
よろしくお願い致します。

A 回答 (3件)

ちょろっと #2 にも書いたんだけど, それだけのためになぜわざわざクラスを作ったりしなきゃならないのか, 全く理解できない.


素直に Vector.elements なり Vector.iterator なりを使えばいいだけのこと.
もっといえば, それくらいなら Enumeration や Iterator を使うまでもない. ふつうに for で書けばいいだけ.
    • good
    • 0
この回答へのお礼

クラスTraversableVectorのコンストラクタに、
public TraversableVector() {
String obj1 = new String("佐藤");
String obj2 = new String("鈴木");
String obj3 = new String("三木");
this.add(obj1);
this.add(obj2);
this.add(obj3);

}

を記述することで、やりたいことができるようになりました。
ありがとうございました。

ただ、御指摘いただいた、クラスTraversableVectorの
public Enumeration createEnumeration() {
return new VectorEnumeration(this);
}

のthisポインタは「クラス VectorEnumeration のインスタンス」ではなく、
「クラス TraversableVectorのインスタンス」です。
ここは、クラスVectorEnumerationがクラスTraversableVectorを参照する形になります。

お礼日時:2010/10/21 11:08

なんとなくやりたいことがわかったような気がしないでもないんだけど, やっぱり何かを混乱しているように見えます.


まず「インスタンス化しているクラスVectorEnumerationにthisポインタで渡しているVectorのオブジェクト」ですが, ここで渡す this は (確かに「Vector のインスタンス」といえなくもないけど) クラス VectorEnumeration のインスタンスです.
そのあとの「たとえば~Employeeをthisポインタとして渡したい」は意味不明. createEnumeration を VectorEnumeration のインスタンスメソッドにしているというのは, 当然「そのメソッドを起動したまさにそのインスタンスに対する Enumeration を返す」ためです. だから, ここではこの書き方しか考えられません. そして,「インスタンス Employee を this として渡す」ためには, インスタンス Employee に対してインスタンスメソッドを起動するしかありません.
でとりあえず「TraversableVector に対して Vector のインスタンスを引数に持つコンストラクタを作ってラップすればいいんじゃないか」と思ったりはしますが, 正直なところ

なんでこんなことをしなければならないのか想像もつかない

というのが本音. 「標準でついているものの劣化コピー」をわざわざ作る理由がわからん.

この回答への補足

すいません。
VectorEnumeration(this)のthisポインタは間違えて解釈していました。

やりたいことは、たとえば、Vector型のEmployeeを作って、そこに従業員の名前を何人か
入れておいて、その要素にTOPのMain()の中でEnumerationの機能を使って、while()文の
中で各要素にアクセスして、それを表示させたいだけなのです。

そのためには、このクラスの構造上で、Vector型のEmployeeをどこにどのように書いたらよいのかがよく分からないということです。

簡単に教えていただけないでしょうか?
よろしくお願い致します。

補足日時:2010/10/20 16:08
    • good
    • 0

正直にいって, 文章が混乱しているので何を言いたいのかがさっぱりわかりません.


「Employeeクラスの中で、Vector型のEmployeeや関数print()をどうやって書いたらいいのか分かりかねています。」
と書いてますけど, 「Employee クラスの中に『Vector 型の Employee』がある」んでしょうか? もしそうだとしたら (そして「Vector 型の Employee」を素朴に解釈するなら), おそらくクラスの設計がすでに間違っています.
また, 「関数 print() をどうやって書いたらいいのか」といわれても, 「どういう表示を求めているのか」が分からない以上「あなたが期待する出力が得られるように」としか言いようがありません.

・クラス Employee の中身
・print で「どのように表示したい」のか
がわかれば, 多少は答えられるかもしれませんが....

この回答への補足

Java版のIteratorの使い方で、ちょっと混乱してしまっているので、順番に質問させてください。
下記のコードで、クラスTraversableVectorの中の関数createEnumeration()で、インスタンス化しているクラスVectorEnumerationにthisポインタで渡しているVectorのオブジェクトですが、たとえば、
  Vector Employee = new Vector();
  String obj1 = new String("佐藤");
  Employee.add(obj1);
として、Employeeをthisポインタとして渡したいのですが、この場合、どう書けばいいのでしょうか?

//ここから

import java.util.*;

public class Main {

public static void main(String[] args) {

  Traversable employees;
  employees = new TraversableVector();

java.util.Enumeration e = employees.createEnumeration();
while(e.hasMoreElements()) {
String emp = (String)e.nextElement();
System.out.println(emp);
}

}

}

class NullEnumeration implements java.util.Enumeration {
public boolean hasMoreElements() { return false; }
public Object nextElement() throws IndexOutOfBoundsException {
throw new IndexOutOfBoundsException();
}

}

interface Traversable {
public Enumeration createEnumeration();

}

class TraversableVector extends java.util.Vector implements Traversable {

public TraversableVector(int initialCapacity,int capacityIncrement) {
super(initialCapacity, capacityIncrement);
}
public TraversableVector(int initialCapacity) {
super(initialCapacity);
}
public TraversableVector() {
Vector Employee = new Vector();
String obj1 = new String("三好");
Employee.add(obj1);
}

public Enumeration createEnumeration() {
return new VectorEnumeration(this);
}

}

class VectorEnumeration implements Enumeration {
public VectorEnumeration(java.util.Vector v) {
_vector = v;
_current = -1;
}

public Object nextElement() throws IndexOutOfBoundsException {
if (!hasMoreElements()) throw new IndexOutOfBoundsException();

return _vector.elementAt(++_current);
}

public boolean hasMoreElements() {
return _vector.size() > _current+1;
}

private int _current;
private java.util.Vector _vector;

}

//ここまで
よろしくお願い致します。

補足日時:2010/10/20 13:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!