bl4*_*4d3 1 java parsing json iterator loops
我正在用org.json中的lib解析这个JSON字符串,我无法理解为什么我将下面的输出放到日志中.
ArrayList<String> al = new ArrayList<String>();
JSONObject demo = new JSONObject("{\"00408C88A2E6\":{\"id\":\"00408C88A2E6\",\"name\":\"Lab\"},\"00408C91188B\":{\"id\":\"00408C91188B\",\"name\":\"Lab1\"},\"00408C944B99\":{\"id\":\"00408C944B99\",\"name\":\"Lato1\"},\"00408C944BA0\":{\"id\":\"00408C944BA0\",\"name\":\"Lato\"}}");
Iterator<String> iterator = demo.keys();
while (iterator.hasNext() ){
al.add((String)iterator.next());
Log.i(LOG_TAG, "size al into while " + al.size());
Log.i(LOG_TAG, "MAC " + iterator.next() + " for the user " + userId);
}
Run Code Online (Sandbox Code Playgroud)
记录输出
07-12 08:55:34.056: INFO/parse(285): size al into while 1
07-12 08:55:34.056: INFO/parse(285): MAC 00408C91188B for the user nweb
07-12 08:55:34.066: INFO/parse(285): size al into while 2
07-12 08:55:34.066: INFO/parse(285): MAC 00408C944B99 for the user nweb
07-12 08:55:34.066: INFO/parse(285): size al 2
Run Code Online (Sandbox Code Playgroud)
我的ArrayList中不应该有4个元素?谢谢
你iterator.next()在循环体中调用了两次.每次执行时,迭代器都会前进.
您可能希望在正文中调用它一次并将其存储在局部变量中.
String next = iterator.next();
al.add(next);
Log.i(LOG_TAG, "MAC " + next + " for the user " + userId);
Run Code Online (Sandbox Code Playgroud)
请注意Iterator<E>定义E next(),因此String在这种情况下您不需要强制转换.
以下是Java语言指南/ For-each循环的示例:
以下是人们在尝试对两个集合进行嵌套迭代时常犯的错误:
Run Code Online (Sandbox Code Playgroud)List suits = ...; List ranks = ...; List sortedDeck = new ArrayList(); // BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasNext(); ) for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(i.next(), j.next()));你能发现这个bug吗?如果你不能,不要感到难过.许多专家程序员在某个时候犯过这个错误.问题是该
next方法在"外部"集合(诉讼)上被调用了太多次.它在外部和内部集合的内部循环中被调用,这是错误的.为了解决这个问题,你必须在外部循环的范围内添加一个变量来保存套装:Run Code Online (Sandbox Code Playgroud)// Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) { Suit suit = (Suit) i.next(); for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(suit, j.next())); }那么所有这些与for-each构造有什么关系呢?它是为嵌套迭代量身定做的!视觉盛宴:
Run Code Online (Sandbox Code Playgroud)for (Suit suit : suits) for (Rank rank : ranks) sortedDeck.add(new Card(suit, rank));
曾经JSONObject.keys()是一个Iterable代替Iterator,那么,每一个你的情况最好的解决方案.如果您认为可读性的提高是值得的,您可以将其添加keys到a中Collection<String>,这是一个Iterable.
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |