2016-04-06 5 views
0

私は、JavaでRFIDリーダーアプリケーションを開発しています。リーダーの結果を抽出するのが難しいです。同じHashmapキーに埋め込まれたArrayList内に特定の値を描画するにはどうすればよいですか?

戻り値のデータ型が異なるため、RFIDタグを読み取るメソッドは、その値を「String」および「Integers」のキーでLinkedHashMapに埋め込まれたArrayListに入力します。

LinkedHashMap lhm = new LinkedHashMap(); 
List<String> listOfStringVals = new ArrayList<String>(); 
List<Integer> listOfIntVals = new ArrayList<Integer>(); 
String tagID = null; 
String TimeStamp = null; 
String Date = null; 
String Time = null; 
int tagAntenna = 0; 

tagReads = r.read(1000); 
// Print tag reads 
for (TagReadData tr : tagReads) 
{ 
    tagID = tr.epcString(); 
    Date = df.format(new Date()); 
    Time = tf.format(new Date()); 
    TimeStamp = Date + " " + Time; 
    tagAntenna = tr.getAntenna(); 

    listOfStringVals.add(tagID); 
    listOfStringVals.add(TimeStamp); 
    listOfIntVals.add(tagAntenna); 

    lhm.put("strings", listOfStringVals); 
    lhm.put("integers", listOfIntVals); 

    // Shut down reader 
    r.destroy(); 
} 
connect.insertData(lhm); 

LinkedHashMapは、抽出するための別のメソッドに転送されます。これにより

System.out.println("Fetching Keys and corresponding [Multiple] Values "); 

for (Map.Entry<String, List<String>> entry : readMap.entrySet()) { 

    String key = entry.getKey(); 
    List<String> values = entry.getValue(); 

    System.out.println("Key = " + key); 
    System.out.println("Values = " + values); 
} 
System.out.println(" Insert Complete! "); 

私は、コンソールに次のように取得する:

Fetching Keys and corresponding [Multiple] Values 
Key = strings 
Values = [tagid1, timestamp1, tagid2, timestamp3, tagid3, timestamp3] 
Key = integers 
Values = [antenna1, antenna2, antenna3] 
Insert Complete! 

は何のコード私がのコレクションを分離(TAGID、タイムスタンプ、および同じ数のグループのアンテナを得ることができるように追加する必要がありますそれぞれが元々属するタグへの値)

EDIT:JSON

入力の 例
var tagReads = [{ 
    "epc" : "0048029C130143700278303F", 
    "timestamp" : "2016-01-02 10:20:45", 
    "antenna" : "1" 
}, 
{ 
    "epc" : "0048029C1301437002783031", 
    "timestamp" : "2016-01-02 10:20:45", 
    "antenna" : "1" 
} 
{ 
    "epc" : "0048029C130143700278305F", 
    "timestamp" : "2016-01-03 12:12:00", 
    "antenna" : "2" 
}]; 
+0

私たちにサンプル値を入力してわかりやすくしてください。 – dambros

+0

申し訳ありませんが、私はJSONについて多くのことを読んでいませんでした。 – Lagostax

+0

あなたのコードにはいくつかのエラーがあるようです。 Collection lhmはインスタンス化されず、forループ内でr.destroyを呼び出すので、最初のタグを読み取らず、2番目のタグを読み取る前にリーダーを破棄しますか? –

答えて

0

なぜあなたは1つのタグのすべての属性を格納するクラスを書いていませんか?

public class RfidTag 
{ 
    private String tagId; 
    private LocalDateTime readTimestamp; 
    private Integer antenna; 

    // Getters and setters 
} 

これを保存するコレクションは、要件によって異なります。タグを読み取った順番を覚えておく必要がある場合は、ArrayListが最適です。 IDでタグを取得する必要がある場合は、マップに格納して、タグIDをキーとして使用し、RfidTagを値として使用できます。例えば

List<RfidTag> tags = new ArrayList<RfidTag>(); 

for (TagReadData tr : tagReads) 
{ 
    RfidTag tag = new RfidTag(); 

    tag.setTagId(tr.epcString()); 
    tag.setReadTimestamp(LocalDateTime.now()); 
    tag.setAntenna(tr.getAntenna()); 

    tags.add(tag); 
} 

その後、あなたはあなたのような何かができる情報印刷したい場合:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
for(RfidTag tag : tags) 
{ 
    System.out.println("Tag: " + tag.getTagId() + " " 
         + "Timestamp: " + tag.getReadTimestamp().format(formatter) + " " 
         + "Antenna: " + tag.getAntenna()); 
} 

それとも、RfidTagでのtoStringをオーバーライドした場合、それはさらに簡単になりますが。

+0

1つのタグの属性を格納することは、RfidTagに別の変数として格納することを意味します。タグを読み取るメソッドは、複数のタグから情報を返すので、どのようにうまくいくかわかりません。また、私の理解から、LinkedHashMapは値を順番に格納することができますが、ArrayListと比較してその機能を使用する方法についてはっきりしていません。 – Lagostax

+0

ループを繰り返すたびに、RfidTagの新しいインスタンスを作成し、その値を設定してコレクションに追加します。 –

+0

私は今、助けてくれてありがとう! – Lagostax

関連する問題