首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >值<不是AnyVal的成员

值<不是AnyVal的成员
EN

Stack Overflow用户
提问于 2017-11-09 22:23:35
回答 3查看 5.2K关注 0票数 2

我一直在用scala编写代码,以找到最短的路径。这是我寻找最短路径的代码。但是我在下面的代码中发现了一个错误

代码语言:javascript
复制
if ( (kv1._1 + kv1._2 )< (kv2._1 + kv2._2)) kv1 else kv2 

错误是

代码语言:javascript
复制
value < is not a member of AnyVal

这是我的代码:

代码语言:javascript
复制
 val inputRDD = sc.textFile(args(0)).map { line =>
  val a = line.split(",")
  (a(0).toLong, (a(1).toLong, a(2).toLong))
}
var distanceRDD = inputRDD.flatMap(x => {
  val pair1 = if (x._1 == 0) (x._1, 0) else (x._1, Long.MaxValue)
  val pair2 = if (x._2._1 == 0) (x._2._1, 0) else (x._2._1, Long.MaxValue)

  List(pair1, pair2)
}).distinct()

for ( index <- 1 to 4 ) {
  val vertexDistanceRDD=  inputRDD.join(distanceRDD)   

  val invertedRDD =vertexDistanceRDD.map(attr => (attr._2._1._2,(attr._2._1._1,attr._2._2)))

  val computedDistBetweenVertRDD =invertedRDD.reduceByKey((kv1, kv2) => {

    if (kv1._2 == kv2._2) if (kv1._1 < kv2._1) kv1 else kv2
    else if (kv1._2.<(kv2._2)){
      if ( kv2._2 != Long.MaxValue) {
        if ( (kv1._1 + kv1._2 )< (kv2._1 + kv2._2)) kv1 else kv2
      }
      else  kv1
    }
    else {
      if ( kv1._2 != Long.MaxValue) {
        if (kv1._1 + kv1._2 < kv2._1 + kv2._2) kv1 else kv2
      }
      else  kv2
    }
  })

  val joinedRDD = computedDistBetweenVertRDD.join(distanceRDD)
  distanceRDD =joinedRDD.map(kv => {
    if (kv._2._2 > kv._2._1._1 + kv._2._1._2) (kv._1,kv._2._1._1 + kv._2._1._2) else (kv._1,kv._2._2)
  })
}

可能的原因是什么,我如何纠正呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-10 06:28:35

表达式

代码语言:javascript
复制
if (x._1 == 0) (x._1, 0) else (x._1, Long.MaxValue)

具有(Long, AnyVal)类型,因为0是一个Int文本(在本例中,它不是隐式转换为Long),并且IntLong的最小上限是AnyVal。正确的代码应该是

代码语言:javascript
复制
if (x._1 == 0) (x._1, 0L) else (x._1, Long.MaxValue)
//                     ^ use Long literal there

第二个if也是如此

票数 5
EN

Stack Overflow用户

发布于 2017-11-09 22:34:17

您需要在参数kv1kv2上设置类型绑定。没有类型信息,编译器只能推断您使用的是匿名对象(AnyVal类型),而匿名对象上没有定义比较运算符。

票数 0
EN

Stack Overflow用户

发布于 2019-12-30 11:17:50

如果存在类型不匹配,则会发生此错误。

我在处理元组列表时遇到了同样的问题。

投入:

代码语言:javascript
复制
val L = List((1,"Raja",2000.0),(2,"Fahad",1000000.0),(3,"shoaib",40023.0),(4,"azeez",89890))

产出:

代码语言:javascript
复制
L: List[(Int, String, AnyVal)] = List((1,Raja,2000.0), (2,Fahad,1000000.0), (3,shoaib,40023.0), (4,azeez,89890))

投入:

代码语言:javascript
复制
L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3))

产出:

:28: error: value >不是AnyVal的成员 L.map(x => (x._1,x._2.toUpperCase,if(x._3 > 10000) x._3+x._3*0.1 else x._3)) ^

我通过使AnyVal为元组(4,azeez,89890) => (4,azeez,89890.0)双倍来解决这个问题。

// FIX之后

输入:

代码语言:javascript
复制
scala> val L = List((1,"Raja",2000.0),(2,"Fahad",1000000.0),(3,"shoaib",40023.0),(4,"azeez",89890.0))

产出:

代码语言:javascript
复制
L: List[(Int, String, Double)] = List((1,Raja,2000.0), (2,Fahad,1000000.0), (3,shoaib,40023.0), (4,azeez,89890.0))

输入:

代码语言:javascript
复制
scala> L.map(x => (x._1,x._2.toUpperCase, if(x._3 > 10000) x._3+x._3*0.1 else x._3))

产出:

代码语言:javascript
复制
res44: List[(Int, String, Double)] = List((1,RAJA,2000.0), (2,FAHAD,1100000.0), (3,SHOAIB,44025.3), (4,AZEEZ,98879.0))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47212617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档