• 締切済み

Listインターフェースの使用法

Listインターフェースの使い方ですが、 List list; String a = new String("AAA"); String b = new String("BBB"); list.add(a); list.add(b); というふうにするとlistは初期化されていませんとエラーになります。 また、Listに格納したオブジェクトの取り出し方も教えてください。

  • arusu
  • お礼率8% (27/308)
  • Java
  • 回答数4
  • ありがとう数2

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.4

 Listインターフェースはそれを実装して新たなリストを作るための土台になるものです。 これをそのまま使うことはできません。 このインターフェースを使ってメソッドを適切に実装すれば、 新たに作ったクラスのインスタンスは、Listを要求するメソッドやコンストラクタに渡すことができます。  以下の例では、addとget以外のメソッドは適当に実装していますので、 実用的にするためにはほかのメソッドも完全に実装する必要があります。 import java.util.*; class mylist extends Object implements List { private int Count; private String Data[]; private Iterator ite; private ListIterator lite; public mylist() { super(); Data = new String[10]; Count = 0; }; public boolean add(Object str) { if (Count >= 10) return(false); Data[Count ++] = new String((String)str); return(true); }; public Object get(int i) { return((i >= Count) || (i < 0) ? "" : Data[i]); }; public void clear() { Count = 0; }; public Object[] toArray() { return(Data); }; public Object[] toArray(Object[] a) { return(Data); }; public int size() { return(Count); }; public boolean isEmpty() { return(Count == 0); }; public boolean contains(Object str) { return(false); }; public Iterator iterator() { return(ite); }; public boolean remove(Object str) { return(false); }; public Object remove(int i) { return(null); }; public boolean removeAll(Collection c) { return(false); }; public boolean containsAll(Collection c) { return(false); }; public void add(int i, Object str) {}; public boolean addAll(int i, Collection c) { return(false); }; public boolean addAll(Collection c) { return(false); }; public boolean retainAll(Collection c) { return(false); }; public Object set(int i, Object str) { return(null); }; public int indexOf(Object str) { return(-1); }; public int lastIndexOf(Object str) { return(-1); }; public ListIterator listIterator() { return(lite); }; public ListIterator listIterator(int i) { return(lite); }; public List subList(int i, int j) { return(this); }; } public class list { public static void main(String args[]) { mylist MyList = new mylist(); MyList.add("abcd"); MyList.add("efgh"); System.out.println((String)MyList.get(-1) + (String)MyList.get(0) + (String)MyList.get(1) + (String)MyList.get(2)); }; }

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.3

java.util.ListのAPIリファレンスには以下の記述があります。 >既知の実装クラスの一覧: >AbstractList, ArrayList, LinkedList, Vector 上の4つがListインターフェイスを実装しているクラスいう事になります。 要するに上記4クラス、又はその派生クラスであればListインターフェイスに定義されているメソッドを自ら実装しなくても使う事ができるという事です。 極論を言えば、インターフェイスとはメソッドが存在する保証でしかありません。 インターフェイス自体に一意の処理コードが記述されている訳ではなくて、処理はimplementsされたクラス内で、そのクラス用途に合わせた形で様々な実装が施されます。 おおよそ、add()で追加、get()で取得と相場は決まっていますが、それは飽くまでもListインターフェイスのメソッドの実装者依存です(笑)全く違った結果にしようと思えば出来ない事はありません。 と、小難しい事を言いましたが、実際のプログラムを書く場合にはListインターフェイス実装クラスの中から自分の目的に一番合ったクラスを見つけて使う事になります。 ArrayList,Vector辺りが一番オーソドックスで使用頻度が高いクラスですので、先ずはその辺りから使用してみてはいかがでしょうか。 String a1=new String("AAA"); String b1=new String("BBB"); ArrayList al=newArrayList(); al.add(a); al.add(b); Object obj1=al.get(0); String str1=(String)obj1; System.out.println(str1); Object obj2=al.get(1); String str2=(String)obj2; System.out.println(str2);

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

>interface java.util.List はインタフェースです。インスタンスを生成することはできません。 >とコンパイルエラーになってしまいます。 >インポートするListはjava.util配下のインターフェースでよろしいのでしょうか。 あーっごめんなさい。こっちのミスでした。 インターフェースはインスタンスを生成できないので、 Listを実装しているクラスを生成し、変数に代入するのです。 JavaのAPIドキュメント(持ってますよね)のListの項をみると、 既知の実装クラスの一覧のところに、ArrayListとかLinkedListとかが あります。 List list = new ArrayList(); のようにしてインスタンスを生成すればいいのです。 「既知の実装クラス」なら、原則的にはどれでもいいのですが、 AbstractListは抽象クラスでインスタンスを生成できません。 またVectorは、スレッド処理には強いですが、スレッドを使わないときは 若干動作が遅くなります。 通常は、ArrayListかLinkedListのどっちかを使います。 どちらを使ってもかまいません。 「ものを入れるのに、鞄を使うか、リュックを使うか」と言うぐらいのちがいです。 どっちにしてもものを入れられることにかわりはありません。 (ただし、「普通ならArrayListの方が早い。List要素の削除や追加が頻繁に 起きるのだったらLinkedListの方が早い」という傾向はあります。)

arusu
質問者

お礼

御回答ありがとうございました。 おかげでコンパイルと実行が無事できました。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

>listは初期化されていませんとエラーになります。 初期化されてないのです。終わり。 (↑おいおい) listは、他のオブジェクトを入れるためのものですが、 これ自体もやはりオブジェクトです。 newによって生成しなければなりません。 具体的には List list = new List(); とします。これでlistに格納することができます。 Listからオブジェクトを取り出すには大きく分けて二つの方法があります。 ひとつはインデックスで取得する方法。 Listの大きさを返すsize()メソッド、 Listのn番目の要素を返すget()メソッドを使って、 for(int i=0;i<list.size();i<++){ Object o = list.get(i); .... } とすると格納されたオブジェクトを得ることができます。 ちょっと面倒なのは、要素はObjectの状態で出てくることです。 使うにはもとのクラス型にもどしてやらなければなりません。 上で得られたオブジェクトがAClassのものだったら、 AClass c = (AClass)o; というふうにキャストしてやります。 (ただしもとのオブジェクトが別の型であった場合、 ここでエラーがおきます。注意すべきところです。) 取り出す方法のもう一つは、Iteratorを使うことです。 Iterator iterator = list.iterator(); while(iterator.hasNext()){ Object o = iterator.next(); ... } というように使います。 説明は面倒なので 『オブジェクト指向における再利用のためのデザインパターン』 のIteratorの項を参考にしてください。 どっちを使えばいいかですが、 オブジェクト指向な人には後者の方が評判のいい方法です。 (Iteratorを使うと、作業途中のlistの要素に対し、追加や削除ができる) しかしややこしく感じるようなら前者でもかまわないでしょう。

arusu
質問者

補足

List list = new List();のとこなんですが、 interface java.util.List はインタフェースです。インスタンスを生成することはできません。 とコンパイルエラーになってしまいます。 インポートするListはjava.util配下のインターフェースでよろしいのでしょうか。

関連するQ&A

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • Listのマッチを判定する便利Util

    Javaで以下のような処理をスマートに実現する良い方法を教えて下さい。 ・Listに配列をaddして、そのListの配列に対して指定した値がいくつマッチするかを判定する。 具体例として、 1、配列を作成 String[] array1 = { "aaa", "bbb", "ccc" }; String[] array2 = { "bbb", "ccc", "ddd" }; String[] array3 = { "ccc", "ccc", "ddd" }; String[] array4 = { "fff", "ggg", "hhh" }; 2、Listに配列を格納 List list = new ArrayList(); list.add(array1); list.add(array2); list.add(array3); list.add(array4); 3、Listの要素から"ccc"と"ddd"が2つマッチする要素を取得 上記の場合は"ccc"と"ddd"が2つマッチするのはarray2だけなのでarray2を取得する。 ※array3も"ccc"と"ddd"が2つありますが、"ccc"が2つあるので計3つマッチと判定して取得しない。 質問は上記3、の箇所です。 できればfor文でループさせて突合せ処理みたいなことは避けてスマートに実現する方法を探しております。 どなたか良い方法をご存知でしたらご教示下さい、お願い致します。

    • ベストアンサー
    • Java
  • Listをフィールドに持つクラスの複製が欲しいです。

    Listをフィールドに持つクラスの複製が欲しいです。 ただし、コピー元を変更しても、コピーしたものは変わってほしくないのです。 Serializableを実装することでディープコピーができるとのことで、サンプルに適当につくったBookクラスでテストしてみました。 public class Book implements Cloneable, Serializable { private static final long serialVersionUID = 8531245739641223373L; public String title; public String[] content; public List<String> list; public Book(){ title = "title"; content=new String[2]; list = new ArrayList<String>(); list.add("aaa"); } @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } public static void main(String[] args) { Book orgBook = new Book(); orgBook.content[0] = "aaa"; orgBook.content[1] = "aaa"; // 二通りの複製方法 Book cloneBook = (Book)orgBook.clone(); Book copyBook = ObjectUtil.getCopy(orgBook); // オリジナルを変更 orgBook.content[1] = "bbb"; orgBook.list.clear(); orgBook.list.add("bbb"); // 複製した中身を確認 System.out.println("clone: " + cloneBook.content[1] + " " + cloneBook.list.get(0)); System.out.println("copy: " + copyBook.content[1] + " " + cloneBook.list.get(0)); } 出力結果は clone: bbb bbb copy: aaa bbb となりました。 上記のObjectUtil.getCopy(object)はシリアライズ・デシリアライズを通してコピーをつくるメソッドです。 cloneで作ったのはもちろん変更されるし、シリアライズで作ったコピーも配列はaaaのままですが、リストはbbbに変わってしまっています。 これがaaaのままになるようなコピーの作り方、ご存知の方教えて下さい。 対象となるクラスが複雑で大きいので、コピーメソッドをつくって一つずづコピーするというのはちょっと避けたいところです。 どうぞよろしくお願いします。 環境:Windows XPと7, jdk1.6, Eclipse3.5 から3.6

    • ベストアンサー
    • Java
  • Listに格納されたオブジェクトの属性毎に集計

    【1】 生徒(Student)クラスを生成し、住所(address)などを設定 【2】 1を、List型オブジェクトに格納。 【3】 2のListの中の生徒(Student)オブジェクトから、住所毎に集計する 3のやり方を教えて下さい。 例えば、以下のような感じです。 --------------------------------------------------- //【1】 Studentオブジェクトを大量に生成し、それぞれに住所などを設定 Student smith = new Student(); smith.setAddress("hongkong"); Student ken = new Student(); ken.setAddress("tokyo"); Student scott = new Student(); scott.setAddress("scottland"); (以下、同様)  ・  ・  ・ //【2】 生成した全てのStudentオブジェクトをListに格納していく。 List studentList = new ArrayList(); studentList.add(smith); studentList.add(ken); studentList.add(scott); (以下、同様)  ・  ・  ・ //【3】 ListオブジェクトからStudentオブジェクトを取得し、 //同じ住所毎に、集計する //<例> //hongkong--- 4900人 //tokyo--- 3800人 //scottland--- 4600人 --------------------------------------------------- 1や2は、すでに出来上がっていて、変更できない為、 3のやり方のみ教えて下さい。 (Studentオブジェクトが格納されたListオブジェクトが、既に存在することが前提) また、Studentオブジェクトが大量にある為、 処理が重くなる実装の仕方は避けたいです・・。 もし分かる方いましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayList で配列を扱う場合の記述方法について

    ArrayList で配列を扱う場合の記述方法について、 探しきれないのでご教授お願いします。 ArrayList list = new ArrayList(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } という箇所をArrayList<Date>listを使って書き直すのはどのようになるでしょうか。 ArrayList<Date>list= new ArrayList<Date>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); for (int i = 0; i < list.size(); i++) { System.out.println(i+"は"+list.get(i)); } とすると、 型 ArrayList<Date> のメソッド add(Date) は引数 (String) に適用できません。 というエラーになってしまいました。

    • ベストアンサー
    • Java
  • javaでリストにオブジェクトを入れたい

    ユーザー情報を配列にしたものをセッターを使い、オブジェクトをリストに入れる処理をしたいです。 例(yamada,pas1,山田) リストを使用しているのは後々他のユーザーを追加する予定の為です。 例(yamada,pas1,山田) (suzuki,pas2,鈴木) リストにlist.add("yamada")などと入力すれば表示させることが出来るのですが、 オブジェクトを入れるとうまくいきません。list.add(オブジェクト名); 実行するとコンソールに「GetUser@19e0bfd」のようなものが出てきます。どうすればよろしいでしょうか? ここから上は省略。カプセル化したゲッターセッターの処理をしています。 public static void main(String[] args){   GetUser gu = new GetUser();//ユーザー情報をnew      String name[]=new String[3];   name[0]="yamada";   name[1]="pas1";   name[2]="山田";   gu.setId(name[0]);   gu.setPass(name[1]);   gu.setName(name[2]);   List list = new ArrayList();   list.add(gu); }

    • ベストアンサー
    • Java
  • Listに格納されているオブジェクトの照合(パターンマッチング?)

    2つのListオブジェクトを比較して、 それぞれの要素に格納されているクラスの属性が 一致しているかどうか、また、格納されている順番が同じかどうかを 調べたいのですが・・。 例えば、以下のようなかんじです↓ 1. 比較するListオブジェクト(1):userList //Userオブジェクト生成 User user1 = new User(); user1.setUserID(2); User user2 = new User(); user2.setUserID(4); //UserオブジェクトをListに格納 List userList = new ArrayList(); userList.add(user1); userList.add(user2); 2. 比較するListオブジェクト(2):specialUserList ※1.と同じ要領で生成されたもの List specialUserList; 3. 1と2を比較する 比較内容は以下の通りです。 1のListオブジェクト(userList)は、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていますが、 2のListオブジェクト(specialUserList)も、 これと同じ構成で格納されているかどうか調べたいのです。 例えば、 2のListオブジェクトも、 1番目の要素に、 UserID:2 を持つUserオブジェクト 2番目の要素 に、UserID:4 を持つUserオブジェクト が格納されていればOKとし、上記以外であれば、NGとします。 例えば、以下のような内容がNGです。 1番目の要素に、 UserID:1(※2以外) を持つUserオブジェクト 2番目の要素 に、UserID:8(※4以外)を持つUserオブジェクト つまり、List要素に格納されている内容と、その格納されている順番が、 1と2で同じかどうかを調べたいのです。 もし分かる方いましたら、お力をお貸しください・・・

    • ベストアンサー
    • Java
  • オブジェクトの関連について

    クラスAAAとクラスBBBをインスタンス化し、それぞれ、aとbのオブジェクトとします。 mainメソッドから、bのbmethメソッドを呼び出し、さらに、Amethメソッドを呼び出し また、mainからもaのAmethメソッドを呼び出し可能にする方法はありませんでしょうか? まだ、Java初心者なもので説明も不十分かと思いますがよろしくお願いします。 class AAA{ void Ameth() { System.out.println("Aメソッド"); } } class BBB{ public AAA a; void bmeth(){ a.Ameth(); } } public class test{ public static void main(String arg[]) { AAA a = new AAA(); BBB b = new BBB(); b.bmeth(); a.Ameth(); } }

  • VC#2010 ArrayListに入れた要素の型

    こんにちは。ArrayListに異なる型のクラスを入れて、後からそれがどの型か判断してから処理しようとしているのですが、エラーになってしまいます。 //ベースオブジェクトクラス class BaseObj { string path; BaseObj(string p){path = p:} } //製品Aクラス BaseObjを継承 class ProductA : BaseObj { ProductA(string p) : base(p) {} } //製品Bクラス BaseObjを継承 class ProductB : BaseObj { ProductB(string p) : base(p) {} } ------------------------------------------- ArrayList ObjList;//オブジェクトを格納する ProductA A = new ProductA(@"C:\"); ProductB B = new ProductB(@"D:\"); ObjList.Add(A); ObjList.Add(B); ------------------------------------------- //ここでは、0番目にAが入ってると分かっているのでAかBか調べる処理は省いてます。 MessageBox.Show'((ProductA)ObjList[0]).path); 上記メッセージボックスのところで、 型 'System.Collections.Generic.List`1[Application.ProductA]' のオブジェクトを型 'Application.ProductA' にキャストできません。 というエラーになってしまいます。これはどうしてなのでしょうか?

  • C#でのリストへの変数の格納

    namespace HtmlCreater { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string aa = "xxx"; string bb = "xxx"; string cc = "xxx"; string dd = "xxx"; string ee = "xxx"; //リスト作成 ArrayList list = new ArrayList(); フォーム作成 aaForm form = new aaForm(aa, bb, cc, dd, ee); list.Add(form); string firstItem = (string)list[0]; Console.WriteLine(firstItem); } class aaForm(string aa, string bb, string cc, string dd, string ee) { String a = "aa"; String b = "bb"; String c = "cc"; String d = "dd"; String e = "ee"; } } } 以上のようなプログラムを使って、リスト list に変数aa,bb,cc,dd,eeを格納したいと考えています。 が、コンパイルすると以下のようなエラーメッセージが表示されます。 識別子が必要です。キー ワードは 'string' です。 無効なトークン '(' が クラス、構造体またはインターフェイスのメンバ宣言で使用されています。 波線はString a = "aa" String b = "bb" String c = "cc" String d = "dd" String e = "ee"にかかっています。 ここで必要な識別子とはなんでしょか?また、その他おかしいところはあるのでしょうか? ご存知の方がいたらご教授宜しくお願いします。

専門家に質問してみよう