2015-11-14 86 views
0

我正在寻找一种方法来迭代对象中包含的条目。目前,我错误地使用每种方法:Android Bundle迭代器放置和删除条目

for (String key : bundle.keySet()) { 
    if ("videourl".equals(key.toLowerCase()) || "priority".equals(key.toLowerCase())) { 
     // Save value to bundle using lowercase key value 
     extras.putString(key.toLowerCase(), (String) extras.get(key)); 
     // Remove original version of this bundle entry 
     extras.remove(key); 
    } 
} 

与上面显示的方法的问题是,它在将来不确定的时间任意的风险,不确定性的行为。

我见过的迭代器实现了Map对象(例如https://stackoverflow.com/a/1884916/3957979):

for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext();) { 
    Map.Entry<String, String> entry = it.next(); 
    if(entry.getKey().equals("test")) { 
    it.remove(); 
    } 
} 

不过,我并没有对捆绑的项目的直接访问,所以我不能使用相同的方法。

请让我知道,如果迭代器可以与Bundle对象一起使用,或者请建议一种不同的方法。

回答

0

不幸的是,我无法找到一种方法来使用迭代器来添加和删除条目到Bundle中。我的解决方法是保存要添加到临时Bundle对象中的条目,并将我想要删除的条目的原始键名保存到列表中。请参阅下面的代码:

// Loop through all messages and change the extras' key names to lowercase (only for keys of interest) 
Bundle tempBundle = new Bundle(); 
ArrayList<String> keysToBeRemoved = new ArrayList<>(); 
Bundle extras = messages.get(i).getExtras(); 

for (String key : extras.keySet()) { 
    // Check if key is not all lower case and if it is a key of interest 
    if (!key.equals(key.toLowerCase()) && isKeyOfInterest(key)) { 
     // Save value to bundle using lowercase key value 
     tempBundle.putString(key.toLowerCase(), extras.getString(key)); 
     // Add original version of this key to a list for later deletion 
     keysToBeRemoved.add(key); 
    } 
} 

// Remove original entries from message extras 
for (String originalKey : keysToBeRemoved) { 
    extras.remove(originalKey); 
} 

// Add all new bundle entries to message extras 
extras.putAll(tempBundle); 

如果有人确实弄清楚如何使用Iterator和Bundle,我很想知道!