java.lang.ClassCastException无法强制转换为java.util.Map $ Entry

时间:2017-06-14 10:58:06

标签: android firebase hashmap

我有这个问题我无法解决:

我从fire base数据库中获取了一些数据。 除非我到达标题列,否则每件事都会起作用 因为标题列是一个json树,它有一个键值行,所以必须在这里写一个新的逻辑。

到目前为止我尝试了什么
 为它创建一个条目并将其保存在我创建的ConfigItem类中的哈希映射中。

我收到的数据很好,但我不知道是谁循环使用它。

当我到达while循环中的第三行时,我得到java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry

我在这里缺少什么?

public class DataMappingConfig implements DataMappingStrategy {

@Override
public Object mapData(HashMap<String, Object> data ) {

    Log.i("key set " , data.keySet().toString() + " key set ") ;
    HashMap<String , Object > mpair  =null ;
    HashMap<String, String> titlepairs = null ;

    for (String key : data.keySet()) {
        if (key.equals(KEY_TITLE)) {

            final Iterator iterator = data.entrySet().iterator();

            while (iterator.hasNext()){
                mpair = new HashMap<String , Object >() ;
                Map.Entry<String, Object> pair = (Map.Entry<String , Object>) data.entrySet() ;
                HashMap<String,HashMap<String , String>> titleMap = (HashMap<String, HashMap<String, String>>) pair.getValue();
                titlepairs = new HashMap<String, String>();;

            }
        }
    }
        ConfigItem conf = new ConfigItem();
        if (data.containsKey(KEY_LOGIN)) {
            conf.setLogin((Boolean) data.get(KEY_LOGIN)); // note the import above
        }
        if (data.containsKey(KEY_ICON)) {
            conf.setIcon((String) data.get(KEY_ICON));
        }
        if (data.containsKey(KEY_MAIN_SCREEN_ORDER)) {
            conf.setNum(safeLongToInt((Long) data.get(KEY_MAIN_SCREEN_ORDER)));
        }
        if (data.containsKey(KEY_MODE)) {
            String modeValue = (String) data.get(KEY_MODE);
            if (modeValue.equals(VALUE_MODE_EMERGENCY)) {
                conf.setEmenrgency(true);
            } else if (modeValue.equals(VALUE_MODE_ROUTINE)) {
                conf.setRoutine(true);
            }
            conf.setMode((String) data.get(KEY_MODE));
        }
        if (data.containsKey(KEY_STATUS)) {
            conf.setStatus((String) data.get(KEY_STATUS));
        }
        if (data.containsKey(KEY_SHOW_DATE)) {
            try {

                conf.setShowDate((Boolean) data.get(KEY_SHOW_DATE));
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                Log.i("ERROR", "" + e.getLocalizedMessage());
            }
        }


        Log.i("Data Map config ", "conf item = " + conf.toString() + "\n");


        return conf;
    }

}

2 个答案:

答案 0 :(得分:0)

您正在尝试将Set投射到Map.Entry

由于您的循环条件为while (iterator.hasNext()),我假设您打算在循环中使用iterator.next()

更改:

Map.Entry<String, Object> pair = (Map.Entry<String , Object>) data.entrySet();

为:

Map.Entry<String, Object> pair = (Map.Entry<String , Object>) iterator.next();

甚至更好,改变:

final Iterator iterator = data.entrySet().iterator();

为:

final Iterator<Map.Entry<String , Object>> iterator = data.entrySet().iterator();

然后你根本不需要那个演员:

while (iterator.hasNext()){
    mpair = new HashMap<String , Object >() ;
    Map.Entry<String, Object> pair = iterator.next();
    HashMap<String,HashMap<String , String>> titleMap = (HashMap<String, HashMap<String, String>>) pair.getValue();
    titlepairs = new HashMap<String, String>();
}

答案 1 :(得分:0)

该行

Map.Entry<String, Object> pair = (Map.Entry<String , Object>) data.entrySet() ;

应该是

Map.Entry<String, Object> pair = (Map.Entry<String , Object>) iterator.next();