相关疑难解决方法(0)

在Scala中组合两个列表

从2个表格列表List[(Int, String):

l1 = List((1,"a"),(3,"b"))
l2 = List((3,"a"),(4,"c"))
Run Code Online (Sandbox Code Playgroud)

如何组合Integers String相同的s来获得第三个列表:

l3 = List((4,"a"),(3,"b"),(4,"c"))
Run Code Online (Sandbox Code Playgroud)

现在我正在遍历两个列表并添加字符串是否相同,但我认为应该有一个简单的模式匹配解决方案.

scala list pattern-matching

17
推荐指数
3
解决办法
2万
查看次数

如何合并多个hashmaps也可以将java中相同键的值相加

我试图合并多个哈希图也总和相同键的值,ı想用玩具示例解释我的问题如下

    HashMap<String, Integer> m = new HashMap<>();
    HashMap<String, Integer> m2 = new HashMap<>();

    m.put("apple", 2);
    m.put("pear", 3);
    m2.put("apple", 9);
    m2.put("banana", 6);
Run Code Online (Sandbox Code Playgroud)

我试过putall

m.putAll(M2);

输出如下{banana = 6,apple = 9,pear = 3}

但它的结果不适用于这个问题.我希望输出为

{banana = 6,apple = 11,pear = 3}

怎么能在java中得到这个结果?

java merge hashmap

14
推荐指数
3
解决办法
9858
查看次数

带有Option参数的二元运算符

在scala中,如何定义两个Option参数的加法?具体来说,让我们说它们是Int类型的包装器(我实际上使用的是双打映射,但这个例子更简单).

我尝试了以下但它只是给了我一个错误:

  def addOpt(a:Option[Int], b:Option[Int]) = {
    a match {
      case Some(x) => x.get
      case None => 0
    } + b match {
      case Some(y) => y.get
      case None => 0
    }
  }
Run Code Online (Sandbox Code Playgroud)

编辑添加:

在我的实际问题中,我添加了两个映射,这些映射是稀疏矢量的替换.因此,无案例返回Map [Int,Double],而+实际上是++(在stackoverflow.com/a/7080321/614684处调整)

scala

7
推荐指数
4
解决办法
1414
查看次数

如何总结基于元组的第一个元素?

我有一个3元组列表,如下所示[我为可读性添加了换行符]:

(2, 127, 3)
(12156, 127, 3)
(4409, 127, 2) <-- 4409 occurs 2x
(1312, 127, 12) <-- 1312 occurs 3x

(4409, 128, 1) <-- 
(12864, 128, 1)
(1312, 128, 1) <-- 
(2664, 128, 2)

(12865, 129, 1)
(183, 129, 1)
(12866, 129, 2)
(1312, 129, 10) <--
Run Code Online (Sandbox Code Playgroud)

我想根据第一个条目总结一下.第一个条目应该是唯一的.

结果应如下所示:

(2, 127, 3)
(12156, 127, 3)
(4409, 127, 3) <- new sum = 3
(1312, 127, 23) <- new sum = 23

(12864, 128, 1)
(2664, 128, 2)

(12865, 129, …
Run Code Online (Sandbox Code Playgroud)

scala tuples

5
推荐指数
1
解决办法
2582
查看次数

如何在Scala的Map List中按键值对值进行求和并对它们进行分组?

我有一张地图清单:

val list = List(
  Map("id" -> "A", "value" -> 20, "name" -> "a"),
  Map("id" -> "B", "value" -> 10, "name" -> "b"),
  Map("id" -> "A", "value" -> 5, "name" -> "a"),
  Map("id" -> "C", "value" -> 1, "name" -> "c"),
  Map("id" -> "D", "value" -> 60, "name" -> "d"),
  Map("id" -> "C", "value" -> 3, "name" -> "c")
)
Run Code Online (Sandbox Code Playgroud)

我想要以最有效的方式对值进行求和value并按id值分组,以便它变为:

Map(A -> 25, B -> 10, C -> 4, D -> 60)
Run Code Online (Sandbox Code Playgroud)

scala

5
推荐指数
2
解决办法
5715
查看次数

Scala 转换为泛型类型

我对泛型类型感到困惑。我希望它2.asInstanceOf[A]被转换为 type A,同时,它被转换为Int. 除此之外,输入是java.lang.Long而输出是一个列表Int(根据定义,输入和输出应该是相同的类型)。这是为什么?

def whatever[A](x: A): List[A] = {
  val two = 2.asInstanceOf[A]
  val l = List(1.asInstanceOf[A],2.asInstanceOf[A])

  println(f"Input type inside the function for 15L: ${x.getClass}")
  println(f"The class of two: ${two.getClass}, the value of two: $two")
  println(f"The class of the first element of l: ${l.head.getClass}, first element value: ${l.head}")
  l
}

println(f"Returned from whatever function: ${whatever(15L)}")

Run Code Online (Sandbox Code Playgroud)

输出:

Input type inside the function for 15L: class java.lang.Long
The class of two: class …
Run Code Online (Sandbox Code Playgroud)

boxing casting scala type-erasure

4
推荐指数
1
解决办法
406
查看次数

在scala.immutable.Map中更新多个值的惯用方法

我需要更新(检索并增加)绑定到地图中两个键的两个不同值.这两个键有时会重合.我现在有以下代码:

// val map: Map[Int, Int]
// val key1, key2: Int
if (key1 == key2) {
  tailRecFunction(someArg, map 
    + Tuple2(key1, 2 + map.getOrElse(key1, 0)))
} else {
  tailRecFunction(someArg, map 
    + Tuple2(key1, 1 + map.getOrElse(key1, 0))
    + Tuple2(key2, 1 + map.getOrElse(key2, 0)))
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果您使用else块时key1 == key2,则值key1 == key2将会错误地增加1而不是2---第二个元组错误地更新原始值,而不是第一个元组应用的值.
是否有更清晰的方式来写这个?

scala idiomatic map

3
推荐指数
1
解决办法
957
查看次数

Scala sum 映射值

我有一个清单

    val l : List[Map[String,Any]] = List(Map("a" -> 1, "b" -> 2.8), Map("a" -> 3, "c" -> 4), Map("c" -> 5, "d" -> "abc"))
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来查找键“a”(Int)、“b”(Double)和“c”(Int)的总和。“d”作为噪声包括在内。

    l.map(n => n.mapValues( v => if (v.isInstanceOf[Number]) {v match {
    case x:Int => x.asInstanceOf[Int]
    case x:Double => x.asInstanceOf[Double]
    }} else 0)).foldLeft((0,0.0,0))((t, m) => (
t._1 +  m.get("a").getOrElse(0), 
t._2 + m.get("b").getOrElse(0.0), 
t._3 + m.get("c").getOrElse(0)))
Run Code Online (Sandbox Code Playgroud)

我预计输出将是 (4, 2.8, 9) 但相反我被丢弃了

<console>:10: error: overloaded method value + with alternatives:
  (x: Int)Int <and>
  (x: Char)Int <and>
  (x: Short)Int <and> …
Run Code Online (Sandbox Code Playgroud)

casting scala map

2
推荐指数
2
解决办法
1万
查看次数

使用scala Maps累积值

可能重复:
合并两个映射并将相同键的值相加的最佳方法是什么?

我有一堆类型的地图Map[String, Int].我希望能够在键对应时将它们合并为值.例如,++地图上的标准方法给出了

Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 3, b -> 2, c -> 5)
Run Code Online (Sandbox Code Playgroud)

我想定义一个结果会给出的操作

Map("a" -> 1, "b" -> 2) ?? Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 4, b -> 2, c -> 5)
Run Code Online (Sandbox Code Playgroud)

在花哨的措辞中,Map[A, B]总是具有幺半群的自然结构,但是当B它本身就是幺半群时有一个不同的结构.

现在,编写一个递归实现并不困难LinkedHashMap,但我认为必须有一些简单而更通用的方法来编写它,可能使用scalaz.有任何想法吗?

scala scalaz

2
推荐指数
1
解决办法
751
查看次数

为什么Map添加重复项只占用最后一个键的值

根据这个问题:

合并两个地图并将相同键值相加的最佳方法是什么?

我需要使用scalaz来获得我想要的东西,但是我很好奇,如果有人知道为什么以下不能像我期望的那样工作?

Map(1->2.0)+(1->1.0)     //Map(1->1.0)
Run Code Online (Sandbox Code Playgroud)

我希望这会导致 Map(1->3.0).但是,似乎地图只返回最后一个键,如下所示:

Map(1->1.0, 1->3.0)     //Map(1->3.0)
Run Code Online (Sandbox Code Playgroud)

所以,基于文档

向此集合添加两个或多个元素并返回一个新集合.

以上,我的猜测是地图可能存储值,但只返回最后一项?这不是我对添加应该做什么的直觉......也许这是一种效率举措.

一旦我有更多的时间,我会看一下代码并尝试从那里弄清楚,但是想问这里,以防有人已经知道了?

scala add map

2
推荐指数
1
解决办法
4351
查看次数