无法访问var in循环。为什么?感谢。
var grupo = "A"
for (a <- dataframe) {
grupo = "B"
}
println(grupo) //Print A
编辑!
dataframe filterP显示如下:
| CODIGO|LISTA|NUMERO|OPCION|NUMERO|OP|VALOR|
+---------+-----+------+------+------+--+-----+
|110111001| P| 0000| A| 0000| 1| 1|
|110111001| P| 0000| A| 0000| 1| 1|
|110111001| P| 0000| A| 0000| 1| 2|
|110111001| P| 0000| A| 0000| 1| 3|
|110111001| P| 0000| A| 0000| 1| 1|
|110111001| P| 0000| B| 0000| 1| 2|
代码:
var grupo = List(filterP.first()(3).toString())
var grupo_tmp = grupo(0)
println("first group:" + grupo(0))
for (a <- filterP) {
if(grupo_tmp != a(3).toString()){
println(grupo_tmp + "|" + a(3).toString())
grupo = a(3).toString() :: grupo
grupo_tmp = a(3).toString()
}
}
println(grupo_tmp)
println("Grupos de lista "+grupo.length)
for(i <- 0 to grupo.length-1){
println("grupo: "+ grupo(i))
}
此印刷品:
first group:A
A|B
A
Grupos de lista 1
grupo: A
我不知道问题出在哪里..
答案 0 :(得分:2)
它肯定可以访问var
内部循环。
grupo
或dataframe
是空的。 a
进行调试。参见示例
scala> var grupo = "A"
grupo: String = A
scala> for (a <- Array("MUTATE-1", "MUTATE-2")) { grupo = a }
scala> grupo
res6: String = MUTATE-2
答案 1 :(得分:1)
我想知道如果你没有收集for
filterP
,dataframe
循环是如何工作的。 for
循环只是transformation
而println
action
不应该在dataframe
上执行Dataframes
。
dataframe
由dafault分区,我猜测你的dataframe
已被分区,而你只得到部分输出。
将driver
收集到var grupo = List(filterP.first()(3).toString())
var grupo_tmp = grupo(0)
println("first group:" + grupo(0))
for (a <- filterP.collect) { //collect the dataframe to the driver
if(grupo_tmp != a(3).toString()){
println(grupo_tmp + "|" + a(3).toString())
grupo = a(3).toString() :: grupo
grupo_tmp = a(3).toString()
}
}
println(grupo_tmp)
println("Grupos de lista "+grupo.length)
for(i <- 0 to grupo.length-1){
println("grupo: "+ grupo(i))
}
应解决问题
first group:A
A|B
B
Grupos de lista 2
grupo: B
grupo: A
我得到输出为
float target = 100.0f;
int index = -1;
float nearest = float.MaxValue;
int count = objectList.Count;
for(int i = count-1; i >= 0; i--)
{
var diff = Math.Abs(objectList[i].value - target);
if(diff < nearest)
{
nearest = diff;
index = i;
}
if(nearest == 0)
break;
}