2016-04-07 19 views
0

申し訳ありませんがタイトルが明確でない場合、私は専門用語ではあまりよくありません。組み込みArrayList <Integer>をローカルで宣言されたArrayList <Integer>に割り当てることができないのはなぜですか?

Iは、2列のArrayListと収集のLinkedHashMap <文字列、リスト<ストリング>>介して別のメソッドに渡される一つの方法から得られた整数のArrayListを有します。私は、受信方法で宣言された空のArrayListに整数のArrayListを設定しようとすると、しかし、それは構文エラーを示しています。「互換性のない型:一覧>一覧> <整数に変換できない<文字列」。

スターター方法:メソッドを受信

public static void main(String[] args) { 

    try{ 

    LinkedHashMap lhm = new LinkedHashMap(); 
    List<String> listEPC = new ArrayList<String>(); 
    List<String> listTimeStamp = new ArrayList<String>(); 
    List<Integer> listAntenna = new ArrayList<Integer>(); 

    String tagID = "EQ5237"; 
    String TimeStampStr = "12:23:22"; 
    int tagAntenna = 2;   

      listEPC.add(tagID); 
      listTimeStamp.add(TimeStampStr); 
      listAntenna.add(tagAntenna); 

      lhm.put("epcs", listEPC); 
      lhm.put("timestamps", listTimeStamp); 
      lhm.put("antennas", listAntenna); 

    insertData insert = new insertData(); 
    insert.insertData(lhm);     //send map with values to new method 

    }catch(Exception e){ 
    e.printStackTrace(); 
    } 
} 

public class insertData { 

    public void insertData(LinkedHashMap<String, List<String>> readMap) { 

      List<String> listEPC = new ArrayList<String>(); 
      List<String> listTimeStamp = new ArrayList<String>(); 
      List<Integer> listAntenna = new ArrayList<Integer>(); 

      String EPC = null; 
      String TimeStamp = null; 
      Integer Antenna = null; 

      listEPC = readMap.get("epcs"); 
      listTimeStamp = readMap.get("timestamps"); 
      listAntenna = readMap.get("antennas");  //error message here 

      for(int i=0; i<readMap.size(); i++){ 

       EPC = listEPC.get(i); 
       TimeStamp = listTimeStamp.get(i); 
       Antenna = listAntenna.get(i); 

       System.out.println("Entry " + i); 
       System.out.println("Values: " + EPC + TimeStamp + Antenna); 
      } 
      } 
} 

このコードは、私は私が私の実際のコードに希望するものではない文字列に整数のすべてのインスタンスを変更する場合にのみ機能します。それはなぜそうであり、どうすればそれを回避するのですか?

+0

。あなたはキャストする必要があります。 – matt

+0

'readMap.size()'を繰り返し処理しますか?それは地図内に含まれるあなたのリストと同じ長さではありません。 – matt

+0

@matt「あなたはキャストしなければならないだろう」私はタイプセーフではありません。 –

答えて

3

を修正することができます。要素は根本的に異なる型です。

新しいList構築する必要があります:もちろん

List<Integer> listOfIntegers = new ArrayList<>(); 
for (String entry : listOfStrings) { 
    listOfIntegers.add(Integer.valueOf(entry); 
} 

、あなたはまた、リストの要素が整数として解析できないという可能性を処理する必要があります。


ただし、すべての情報を1つのマップに埋め込むだけで、タイプ情報を捨ててしまいます。

insertData(listEPC, listTimestamp, listAntenna); 

、その後、あなたはメソッドシグネチャに別のリストタイプを持つことができます:別に3つのリストを渡す方が良いでしょう、あなたのLinkedHashMapが一覧 ないリスト が含まれているため

void insertData(
    List<String> listEPC, 
    List<String> listTimestamp, 
    List<Integer> listAntenna) { ... } 
+0

OPがどのようにマップを作成したかを見ると、リストの1つが実際にList matt

+0

@matt yepであるため、トップソリューションは例外をスローします。私は上記の生の型の使用についてコメントしました。 –

+0

ありがとう!私は、複数の値のグループを渡す唯一の方法はコレクションを通るという印象を受けました。この方法ははるかに簡単な解決法です。 – Lagostax

1

私は底に適切な答えを含めるつもりですが、あなたの質問のタイトルに関しては、あなたがあなたのメソッドのシグネチャを変更する必要があります。そして、リストを唱えるのいずれか

LinkedHashmap<String, List<?>> readMap; 

、意志安全でないキャストが発生します。例えば。

List<String> listEPC = (List<String>)readMap.get("epcs"); 

またはオブジェクトをキャストします。

List<?> listEPC = readMap.get("epcs"); 

次にループキャストで。

EPC = (String)listEPC.get(i); 

注:これらは良い解決策ではありません。

必要なのは、必要なすべてのデータを持つオブジェクトを含むリストです。

思考プロセスは、これらの行に沿って何か起こったと思います。「私はこれらのことがあり、2つの文字列と整数を含んでいます。次に、「これらのもののコレクションを作成するにはどうすればよいですか?」という質問をします。

この質問に間違った答えは、 "私は各値のリストを作成し、関連する値をインデックスで一致させます"です。正解は、「自分のデータを表現するクラスを作成し、それをリストに格納します。これは、オブジェクト指向プログラミング(javaへようこそ)の基本的な本質です。

まず、クラスを設計します

class EPCThing{ 
    String EPC; 
    String timeStamp; 
    int Antennas; 

    public EPCThing(String tagId, String timeStamp, int antennas){ 
     EPC=tagId; 
     this.timeStamp = timeStamp; 
     Antennas = antennas; 
    } 

    @Override 
    public String toString(){ 
     return "Values: " + EPC + TimeStamp + Antenna 
    } 

} 

今、あなたのプログラムの主な方法は次のようになります。

List<EPCThing> things = new ArrayList<>(); 

String tagID = "EQ5237"; 
String TimeStampStr = "12:23:22"; 
int tagAntenna = 2;   

EPCThing thing = new EPCThing(tagID, TimeStampStr, tagAntenna); 
things.add(thing); 

insertData insert = new insertData(); 
insert.insertData(things); 

その後、我々はあなたがList<Integer>List<String>を割り当てることはできませんあなたのinsertData方法

public void insertData(List<EPCThing> things) { 

    for(int i=0; i<things.size(); i++){ 

      System.out.println("Entry " + i); 
      System.out.println("Values: " + things.get(i)); 

    } 
} 
+0

ここでの基本的な問題は、マップには文字列のリストにマップされた文字列しか含まれていませんが、OPは 'Integer'のリストを取得しようとしています。キャストはエラーをコンパイル時から実行時に移動することを除いて、ここでは何もしません。 – Paul

+0

@Paul OPがマップを作成する場所では、リストが挿入されます。 – matt

+0

sry、それを逃した。そのコードはかなり悪いです – Paul

関連する問題