dポイントプレゼントキャンペーン実施中!

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

A 回答 (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));

};

}
    • good
    • 0

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);
    • good
    • 1

>interface java.util.List はインタフェースです。

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

あーっごめんなさい。こっちのミスでした。
インターフェースはインスタンスを生成できないので、
Listを実装しているクラスを生成し、変数に代入するのです。
JavaのAPIドキュメント(持ってますよね)のListの項をみると、
既知の実装クラスの一覧のところに、ArrayListとかLinkedListとかが
あります。
List list = new ArrayList();
のようにしてインスタンスを生成すればいいのです。

「既知の実装クラス」なら、原則的にはどれでもいいのですが、
AbstractListは抽象クラスでインスタンスを生成できません。
またVectorは、スレッド処理には強いですが、スレッドを使わないときは
若干動作が遅くなります。
通常は、ArrayListかLinkedListのどっちかを使います。
どちらを使ってもかまいません。
「ものを入れるのに、鞄を使うか、リュックを使うか」と言うぐらいのちがいです。
どっちにしてもものを入れられることにかわりはありません。
(ただし、「普通ならArrayListの方が早い。List要素の削除や追加が頻繁に
起きるのだったらLinkedListの方が早い」という傾向はあります。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/09 22:19

>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の要素に対し、追加や削除ができる)
しかしややこしく感じるようなら前者でもかまわないでしょう。

この回答への補足

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

補足日時:2003/03/09 21:18
    • good
    • 0

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