【问题标题】:How to iterate over MultiValueMap of type <String,Any> where <Any> can be another MultiValueMap and so on如何迭代 <String,Any> 类型的 MultiValueMap 其中 <Any> 可以是另一个 MultiValueMap 等等
【发布时间】:2016-09-26 02:22:54
【问题描述】:

我想遍历&lt;String,Any&gt; 类型的MultiValueMap,其中Any 可以是&lt;String,Any&gt; 类型的另一个MultiValueMap,Any 可以是另一个MultiValeMap 等等。我的代码是只提取地图的第一级:-(“结果”变量是MultiValueMap

val entrySet = result.entrySet();
val it = entrySet.iterator();
//System.out.println("  Object key  Object value");
while (it.hasNext()) {
    val mapEntry= it.next().asInstanceOf[java.util.Map.Entry[String,Any]];
    val list = (result.get(mapEntry.getKey()).asInstanceOf[List[String]])
    for (j <- 0 to list.size - 1) {
        //mapEntry.setValue("dhjgdj")
        System.out.println("\t" + mapEntry.getKey() + "\t  " + list.get(j));
    }
}

【问题讨论】:

    标签: scala hashmap iterator multivalue


    【解决方案1】:

    一种方法是收集所有元素(键->值对),然后将累积的集合变成一个迭代器。

    def toItr(m: Map[String,_]): Iterator[(String,_)] =
      m.foldLeft(Vector.empty[(String,_)]){
        case (acc, (k, v: Map[String,_])) => acc ++ toItr(v).toVector
        case (acc, x) => acc :+ x
      }.toIterator
    
    toItr( Map("a"->1, "b"->3, "c"->Map("x"->11, "y"->22)) )
    // result: Iterator[Tuple2[String, _]] = non-empty iterator
    // contents: (a,1), (b,3), (x,11), (y,22)
    

    【讨论】:

    • 感谢jwvh的回复。我想在 saxParsing XML 期间应用它。所以在每一步我都必须迭代到我正在解析的当前元素的根节点,并将那里的子节点添加到 MultiValueMap。那么每次 MultiValueMap 更新时我都必须创建一个迭代器吗?
    • 如果我正确理解您的问题,听起来答案是肯定的,每个子Map/Iterator 都需要一个新的Iterator
    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2021-12-13
    • 2022-01-20
    • 2021-10-02
    • 2018-08-05
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多