2013-08-03 31 views
7

整数と文字列を含むArraylistを作成したいと思いますか?整数と文字列を含むArraylist

下記のように私は2つのArrayListを作成しました:

ArrayList<Integer> intList=new ArrayList<Integer>(); 
    intList.add(1); 
    intList.add(2); 

ArrayList<String> strList=new ArrayList<String>(); 
    strList.add("India"); 
    strList.add("USA"); 
    strList.add("Canada"); 

私は新しいのArrayListにintList & strListを載せていきたいと思います。

私はそれを行うことができますか?もしそうなら、How ??

+6

ええ、あなたは 'ArrayList 'を作成することができますが、私のアドバイスはこれです:do not。タイプが混在しているリストを作成しないでください。これは、プログラムデザインが壊れていることを示しています。この種のモンスターが必要ないように改善する必要があるからです。 –

+2

1つのArrayListで2つの異なる型を混在させたいのはなぜですか? –

+0

この2つのリスト間に依存関係はありますか? –

答えて

7

を取得中にオブジェクトをチェック

List<List> listOfMixedTypes = new ArrayList<List>(); 

ArrayList<String> listOfStrings = new ArrayList<String>(); 
ArrayList<Integer> listOfIntegers = new ArrayList<Integer>(); 

listOfMixedTypes.add(listOfStrings); 
listOfMixedTypes.add(listOfIntegers); 

しかし、より良い方法は、コンパイラはもはや整数リストに文字列を置くような種類を混合することを防ぐことはできないだろうので、二つのリストを追跡するためにMapを使用することです。

Map<String, List> mapOfLists = new HashMap<String, List>(); 

mapOfLists.put("strings", listOfStrings); 
mapOfLists.put("integers", listOfIntegers); 

mapOfLists.get("strings").add("value"); 
mapOfLists.get("integers").add(new Integer(10)); 
+1

生の種類=不良 – newacct

5

これが回避できる場合は、このオブジェクトタイプのリストを避けてください。個々のリストに行く。

あなたはすべてのタイプのオブジェクトを受け入れますが、取得しているときに世話をする必要がありObject

List<Object> list = new ArrayList<Object>(); 

のタイプのために行くべきではない場合。しかし、リストコンテナのジェネリックに放棄する必要があり、次のようにあなたがこれを行うことができます

for (Object obj: list) { 
    if (obj instanceof String){ 
     // this is string 
    } else if (obj instanceof Integer) { 
     // this is Integer 
    } 
} 
2
List<Object> oList=new ArrayList<Object>(); 
+1

私はなぜあなたはとても怒っているのか理解できませんか?彼はちょうど質問をしています。私は正しい答えを示します。 –

+0

私は怒っていません。しかし、私は答えとして与えられた悪いアドバイスを嫌いです。 –

2

あなたはタグ付けされた和タイプを使用することができます。Either<A, B>Left<A, B>Right<A, B>のいずれかです。 Javaでは、次のようになります。

public interface Either<A, B>; 
public class Left<A, B> implements Either<A, B> { 
    public final A value; 
    public Left(A value) { 
    this.value = value; 
    } 
} 
public class Right<A, B> implements Either<A, B> { 
    public final B value; 
    public Right(B value) { 
    this.value = value; 
    } 
} 

したがって、ArrayList<Either<Integer, String>>を使用できます。

for (Either<Integer, String> either : intsOrStrings) { 
    if (either instanceof Left) { 
    Integer i = ((Left<Integer, String>) either).value; 
    } else if (either instanceof Right) { 
    String s = ((Right<Integer, String>) either).value; 
    } 
} 

このアプローチは、Objectを使用するよりも型の安全です。

関連する問題