• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:下記の様に、Employeeの(クラス)型でキャストした場合の、Emp)

EmployeeのVectorを使った書き方がよく分からない

このQ&Aのポイント
  • Employeeのクラス型でキャストした場合に、EmployeeのVectorを使った書き方が分からない
  • Employeeクラスの中で、Vector型のEmployeeや関数print()の書き方が分からない
  • 質問者は助言を求めている

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ちょろっと #2 にも書いたんだけど, それだけのためになぜわざわざクラスを作ったりしなきゃならないのか, 全く理解できない. 素直に Vector.elements なり Vector.iterator なりを使えばいいだけのこと. もっといえば, それくらいなら Enumeration や Iterator を使うまでもない. ふつうに for で書けばいいだけ.

tmiyoshi
質問者

お礼

クラス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を参照する形になります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

tmiyoshi
質問者

補足

すいません。 VectorEnumeration(this)のthisポインタは間違えて解釈していました。 やりたいことは、たとえば、Vector型のEmployeeを作って、そこに従業員の名前を何人か 入れておいて、その要素にTOPのMain()の中でEnumerationの機能を使って、while()文の 中で各要素にアクセスして、それを表示させたいだけなのです。 そのためには、このクラスの構造上で、Vector型のEmployeeをどこにどのように書いたらよいのかがよく分からないということです。 簡単に教えていただけないでしょうか? よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

tmiyoshi
質問者

補足

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; } //ここまで よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Eclipseで、クラスを新規作成する時に付いてくるコメント

    Eclipseで、クラスを新規作成する時に付いてくるコメント クラスを新規作成すると、自動的に下記のようなコメントが 書かれてきますが、いつもいちいち行削除しています。 一般的には、このままにしておくものなのでしょうか。 それとも、消した方が良いのでしょうか。 宜しく御願い申し上げます。 public class Sample { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ } }

    • ベストアンサー
    • Java
  • eclipseのコンソール

    eclipseでコンソールが表示しません。 単純な文字出力です。 ご教授よろしくお願いいたします。 public class AAA { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ System.out.println("コンソールに表示"); } }

  • 初心者ですが・・・。

    初心者なのですが困っています。 以下のコードを実行したとき、実行例が表示されるように必要なクラスを作成せよ。 また、それらをカプセル化し、それを使用するよう以下のコードを修正せよ。カプセル化に関わる部分以外修正しないこと。 public class sanple{ public static void main(String[] args){ Employee[] emp=new Employee[4]; emp[0]=new Shain(); emp[0]=new Kacho(); emp[0]=new Bucho(); emp[0]=new Syacho(); for(int i=0;i<imp[i].length;i++){ System.out.println(emp[i].grade+":"+emp[i].salary); } } } かなり困ってます。どうか回答お願いします。

  • VectorからデータをとりJSPへ・・

    基本的な質問ですいません。 Vector vector = new Vector(); Vector userlog = new Vector(); vector.add(answer); answerの中身は省略します。 Enumeration e = vector.elements(); while(e.hasMoreElements()){ Object obj = e.nextElement(); AA A = (AA)obj; String loglog = A.log; userlog.addElement(loglog); } request.setAttribute("logname", userlog); でAに含まれるlogを取り出し、JSPに表示したいのですが、方法が分かりません。 logic:iterateを用いるのでしょうか?参考になるサイトありましたらお願いします。 ちなみにloglogについてはSystem.out.で確認できています。

    • ベストアンサー
    • Java
  • GOF本のデザインパターンのCompositeパターンのJava版を実

    GOF本のデザインパターンのCompositeパターンのJava版を実際に動かしてみようと思って、ちょっと手を加えて下記のようなコードにしているのですが、Mainのcabinet.add(chassis);の所で、 CompositeEquipmentクラスの_equipment.addElement(equipment);を呼び出した所で、 何故かNullPointerException例外が発生してしまいます。Equipmentクラス変数としてchassisのオブジェクトがequipmentに渡っているはずなのですが、理由がよく分かりません。どなたか、お分かりになる方、御教示いただけたらと思います。 //ここから import java.util.Vector; import java.util.Enumeration; //Mainクラス public class Main { public static void main(String[] args) {   // TODO 自動生成されたメソッド・スタブ   Cabinet cabinet = new Cabinet("PC Cabinet"); Chassis chassis = new Chassis("PC Chassis"); cabinet.add(chassis);        //以下省略 } } // Equipmentクラス abstract class Equipment { public Equipment(String name) { _name = name; } String name() { return _name; }   //一部省略 public void add(Equipment equipment) { } public void remove(Equipment equipment) { } public Enumeration createEnumeration() { return new NullEnumeration(); } private String _name; } //CompositeEquipmentクラス class CompositeEquipment extends Equipment { public CompositeEquipment(String name) { super(name); // ... }   //一部省略 public void add(Equipment equipment) { _equipment.addElement(equipment); //System.out.println(equipment); } public void remove(Equipment equipment) { _equipment.removeElement(equipment); } public Enumeration createEnumeration() { // concrete iterator を作成する return new NullEnumeration(); } private Vector _equipment; } //Cabinetクラス ublic class Cabinet extends CompositeEquipment { public Cabinet(String name) { super(name); // ... } // ... } //Chassisクラス public class Chassis extends CompositeEquipment { public Chassis(String name) { super(name); // ... } // ... } //ここまで

    • ベストアンサー
    • Java
  • DAOクラスの使い方

    ある書籍を参考に勉強しております。以下のDAOクラスのデータ追加に関して使い方がわかりません。 サーブレット、もしくはJSPにどのように書けば、DBにデータを追加できるようになるのでしょうか? 宜しく御願い致します。 package chap11_database.sec03; import java.sql.*; import java.util.ArrayList; public class EmployeeDAO { //データベースとの接続に必要な情報を保持するフィールド変数 private final static String DRIVER_URL ="jdbc:mysql://192.168.2.200:3306/satoh" + "?useUnicode=true&characterEncoding=utf8"; private final static String DRIVER_NAME = "com.mysql.jdbc.Driver"; private final static String USER_NAME = "root"; private final static String PASSWORD = "1qaz!QAZ"; //接続メソッド protected Connection createConnection(){ try{ Class.forName(DRIVER_NAME); Connection con = DriverManager.getConnection(DRIVER_URL, USER_NAME, PASSWORD); return con; } catch(Exception e){ e.printStackTrace(); } return null; //例外が発生した場合はnullを返す。 } //切断メソッド protected void closeConnection(Connection con){ try{ con.close(); } catch(Exception ex){ ex.printStackTrace(); } } public ArrayList<Employee> findAll(){ //社員一覧を保持するリスト ArrayList<Employee> list = new ArrayList<Employee>(); Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "select * from employee"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String address = rs.getString("address"); int tel = rs.getInt("tel"); Date birthday = rs.getDate("birthday"); Employee employee = new Employee(id, name, address, tel, birthday); //TO(Employeeオブジェクト)を、社員一覧を保持するリス手に追加 list.add(employee); } //社員一覧を返す。 return list; }catch(Exception e){ e.printStackTrace(); return null; }finally{ //データベースからの切断 closeConnection(con); } } //社員登録メソッド public void create(Employee emp){ Connection con = null; try{ //データベースに接続 con = createConnection(); //データベースにSQL文を送信 String sql = "insert into employee values(?, ?, ?, ? ,?)"; PreparedStatement stmt = con.prepareStatement(sql); stmt.setInt(1, emp.getId()); stmt.setString(2, emp.getName()); stmt.setString(3, emp.getAddress()); stmt.setInt(4, emp.getTel()); stmt.setDate(5, emp.getBirthday()); stmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ //データベースからの切断 closeConnection(con); } } }

    • ベストアンサー
    • Java
  • 抽象クラスからオーバーライドについて

    EclipseでJavaを勉強始めました。 抽象クラスからオーバーライドするところで質問致します。 抽象クラスとして、「面積を計算する」というメソッドをもつDiagramクラスを定義しました。それを継承して、「四角形の面積を計算する」というメソッドをもつSquareクラスと、「三角形の面積を計算する」というメソッドをもつTriangleクラスを定義しました。 Squareクラス、Triangleクラスからインスタンスを生成して、四角形、三角形の面積をコンソールに表示させるという簡単なプログラムです。 このとき、main関数と3つのクラスの関係についてお尋ねします。 (1)iagram.java、Square.java、Triangle.javaそれぞれにクラス定義とmain関数を持たせるパターン public abstract class Diagram { // 面積計算定義(抽象メソッド) public static void main(String[] args) { } } public class Square extends Diagram{ //四角形の面積の計算定義 public static void main(String[] args) { //四角形の面積の計算と表示 } public class Triangle extends Diagram{ //三角形の面積の計算定義 public static void main(String[] args) { //三角形の面積の計算と表示 } (2)sample.javaというファイルにまとめ、その中にこの3つのクラス定義とmain関数を一つ持たせるパターン public class sample { public static void main(String[] args) { //四角形の面積の計算と表示 //三角形の面積の計算と表示 } } abstract class Diagram { // 面積計算(抽象メソッド)定義 } class Square extends Diagram{ //四角形の面積の計算定義 } class Trapezoid extends Diagram{ //三角形の面積の計算定義 } この二通りを考えて、どちらも実行できたのですが、どちらの方がJavaらしいプログラムと思われますでしょうか?

    • ベストアンサー
    • Java
  • クラス名はどうするのですか?

    package ex7; public class Sample { public final static int VALUE = 100; } package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } 上記のプログラムのクラス名は何をつければいいですか・・・? 同じくプログラム名は何と付ければいいですか・・・? ご多忙中恐れいります・・・。 ご回答の程宜しくお願い申し上げます。 回答者 これが、素人さんには分かりにくいんですね。 mkdir ex7 で、ex7 というディレクトリを作製して、 その中に、 Sample.java を public class Sample { public final static int VALUE = 100; } で、 Main.java を package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } で作製して、 ex7 の中から出て、 javac ex7/Sample.java javac ex7/Main.java でコンパイルします。 質問者 度々すいません・・・。 ファイル名は何にすればいいですか・・・? ご回答がなかなか来ません。

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • ID3タグの情報を取得したいのですが・・・・

    指定したディレクトリ以下にある複数のMP3ファイルからID3タグの情報(アーティスト・作成年・曲名)など表示するプログラムなのですが、実行すると”引数にディレクトリを指定して”と言う表示が返されてしまいます。このプログラムのどの個所にディレクトリを指定する記述をすれば指定したディレクトリ以下のMP3ファイルからID3タグの情報を表示させることができるか教えてください。(>_<) プログラムは大きく分けて      [ID3TagのVer1.0/1.1取得するクラス]       [ID3TagのVer2.3 取得するクラス]      [ID3TagのVer1.0/1.1とVer2.3 取得クラスのスーパークラス]      [指定ディレクトリ以下のファイル一覧を取得するクラス]      [ID3TagのVer1.0/1.1とVer2.3 取得クラスを取得・保持するクラス]      [ID3Tag取得プログラムするMainクラス]                                             から構成されています。 <以下に示すのがMainクラスのプログラムです。> import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ArrayList; public class MP3FileListMain { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { if(args.length < 1) { System.out.print("引数にディレクトリを指定して\n"); return; } File objFile = new File(args[0]); if(!objFile.isDirectory()) { System.out.print("引数に指定したのは、ディレクトリではない\n"); System.out.print("引数にディレクトリを指定して\n"); return; } FileList objFileList = new FileList(objFile); long lRnt = objFileList.getFileInfo(); // System.out.print(lRnt); try { MP3Tag.init(); } catch (ClassNotFoundException e) { e.printStackTrace(); } MP3Tag.outputFiles(objFileList); } private static class MP3Tag { private static long lSeriesNo_ = 0; private static long lMaxSeriesNo_ = 0; private static long lFileNo_ = 0; private static long lMaxFileNo_ = 0; private static long lTypeNo_ = 0; private static SimpleDateFormat sdf_; private static int handle1_; private static int handle2s_; private static int handle21s_; private static int handle22s_; private static int handle2i_; private static int handle3s_; private static int handle3i_; private static int handle3u_; private static void init() throws ClassNotFoundException { sdf_ = new SimpleDateFormat("yyyyMMddHHmmss"); } private static void outputFiles(FileList objFileList) { int handle = 0; long lSeriesNo = lSeriesNo_; MP3File objMP3File; ArrayList objMP3List; // System.out.print(objFileList.getDir() + "\n"); Iterator iteMP3File = objFileList.getMP3FileIte(); while(iteMP3File.hasNext()) { objMP3File = (MP3File)iteMP3File.next(); try { objMP3List = objMP3File.getMP3Info(); } catch (Exception e) { e.printStackTrace(); return; } try { for(int i = 0; objMP3List.size() > i; i++) { System.out.print(lFileNo_ + ","); System.out.print(lTypeNo_ + ","); System.out.print(lSeriesNo + ","); MP3Info objMP3Info = (MP3Info)objMP3List.get(i); System.out.print(objMP3Info.getLastModified() + ","); System.out.print(objMP3Info.getFileSize() + ","); System.out.print(objMP3Info.getTagVersion() + ","); System.out.print(objMP3Info.getTrackNo() + ","); System.out.print(objMP3Info.getTitle() + ","); System.out.print(objMP3Info.getGenre() + ","); System.out.print(objMP3Info.getArtist() + ","); System.out.print(objMP3Info.getComment() + ","); System.out.print(objMP3Info.getYear() + ","); System.out.print(sdf_.format(new Date()) + ","); System.out.print(objMP3Info.getPath() + ","); System.out.print(objMP3Info.getFileName() + "\n"); } } catch (Exception e) { e.printStackTrace(); return; } lFileNo_++; } Iterator iteDir = objFileList.getDirIte(); while(iteDir.hasNext()) { outputFiles((FileList)iteDir.next()); } } } }

    • ベストアンサー
    • Java