0

I have a problem in JAVA when i'm trying to return a HashMap that I have added to a list of type: List<Object>. I know I can use other type of lists, but I need to use List<Object>

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

    HashMap<String, String> hashmap = new HashMap<String,String>();
    hashmap.put("x", "foo");
    hashmap.put("y", "bar");

    listOfObjects.add(hashmap);

    for (int i = 0; i < listOfObjects.size(); i++) {
        System.out.println(listOfObjects.get(i));
    }

I have added my hashmap to my listOfObject, but how do I get the HashMap from the listOfObject such that I can use the HashMap-commands. fx: hashmap.get("x) and it will return "foo".

Normally i thought i could just write: listOfObjects.get(0).get("x") and it would return "foo" but that does not work.

If anyone know another work around that's find but I just need to use a List.


using timer in background worker in windows phone

I am develping an app which load some url, parse them, keep them into sqlite db and the UI will read the saved data and show them in controls. This progress should be done in almost an infinit loop. For having fast response i plan to read the data from db in main thread and have an other thread (background worker) to load the data and insert it into db. Is it logical and possible to run read and write process in dispatchertimer, one timer in main thread and the other inside the background worker? and how? Or does anyone have better idea?

main thread:
    DispatcherTimer _Timer1 = new DispatcherTimer();
                _Timer1.Interval = _Interval;
                _Timer1.Tick += _Timer1_Tick;
    void _Timer1_Tick(object sender, EventArgs e)
            {
               // read data from db and show in controls
             }

secondary thread:
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        DispatcherTimer _Timer2 = new DispatcherTimer();
                _Timer2.Interval = _Interval;
                _Timer2.Tick += _Timer2_Tick;


    }
    void _Timer2_Tick(object sender, EventArgs e)
            {
               // write data into db
             }
    }
4

2 に答える 2

3

通常、私は次のように書くことができると思っていました: listOfObjects.get(0).get("x") そしてそれは "foo" を返しますが、それはうまくいきません。

いいえ、そうではありません - の型listOfObjects.get(0)は単にObject. それがマップであることをコンパイラがどのように知ると思いますか?

以下を使用できます。

HashMap<String, String> map = (HashMap<String, String>) listOfObjects.get(0);
// Use map...

...しかし、Java のジェネリックの性質上、そのキャストは、マップ内のすべてのキーと値のペアが「文字列から文字列へ」であることを実際には保証していないことに注意してください。最初に使用した場合でも、キャストは機能します。

Map<Integer, Integer> badMap = new HashMap<Integer, Integer>();
badMap.put(0, 10);
listOfObjects.add(badMap);

これに対して警告が表示されますが、その意味を理解することが重要です。ユースケースが何であるかは明確ではありませんが、より強く型付けすることができれば (おそらく? を含む新しいクラスを作成することができれば) 、Map<String, String>それは良いことです。リストのすべての要素がマップになりますか? List<Object>もしそうなら、より厳密に型指定されたリストではなく、なぜ使用しているのですか? 一部の要素がマップにならない場合、どの要素がマップになるかをどのように判断できますか? (これらは、慎重に検討する必要がある種類のものです。)

于 2013-02-11T13:12:14.970 に答える
1

これがあなたを助けることを願っています..

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

        HashMap<String, String> hashmap = new HashMap<String,String>();
        hashmap.put("x", "foo");
        hashmap.put("y", "bar");

        listOfObjects.add(hashmap);

        for (int i = 0; i < listOfObjects.size(); i++) {
            System.out.println(((HashMap<String, String>)listOfObjects.get(i)).get("x"));
        }

通常、リストのタイプは object です。最初に HashMap タイプにキャストしてから、マップから値を取得します

次のコードに注意してください

 System.out.println(((HashMap<String, String>)listOfObjects.get(i)).get("x"));
于 2013-02-11T13:17:59.327 に答える