Ваш код не работает, потому что он делает это:
Create variable `funcs` and assign it an empty array;
Loop from 0 up until it is less than 3 and assign it to variable `i`;
Push to variable `funcs` next function:
// Only push (save), but don't execute
**Write to console current value of variable `i`;**
// First loop has ended, i = 3;
Loop from 0 up until it is less than 3 and assign it to variable `j`;
Call `j`-th function from variable `funcs`:
**Write to console current value of variable `i`;**
// Ask yourself NOW! What is the value of i?
Теперь вопрос в том, каково значение переменной i
при вызове функции? Поскольку первый цикл создается с условием i < 3
, он немедленно останавливается, когда условие ложно, поэтому оно i = 3
.
Вам нужно понять, что во время создания ваших функций ни один из их кодов не выполняется, он сохраняется только позже. И поэтому, когда они вызываются позже, интерпретатор выполняет их и спрашивает: «Каково текущее значение i
?»
Итак, ваша цель - сначала сохранить значение функции i
для функции и только после этого сохраните функцию до funcs
. Это можно сделать следующим образом:
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function(x) { // and store them in funcs
console.log("My value: " + x); // each should log its value.
}.bind(null, i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
Таким образом, каждая функция будет иметь свою собственную переменную x
, и мы устанавливаем значение x
на значение i
на каждой итерации.
Это только один из нескольких способов решения этой проблемы.
Отказ от ответственности: это предназначено только для отображения возможностей фильтрации каналов GraphFrames.
Ну, теоретически это возможно. Вы можете использовать шаблоны GraphFrames для поиска путей. Предположим, что ваши данные выглядят следующим образом:
import org.graphframes.GraphFrame
val nodes = "abcdefghij".map(c =>Tuple1(c.toString)).toDF("id")
val edges = Seq(
// Long path
("a", "b"), ("b", "c"), ("c", "d"), ("d", "e"), ("e", "f"),
// and some random nodes
("g", "h"), ("i", "j"), ("j", "i")
).toDF("src", "dst")
val gf = GraphFrame(nodes, edges)
и вы хотите найти все пути с не менее чем 5 узлами.
Вы можете построить следующий шаблон пути:
val path = (1 to 4).map(i => s"(n$i)-[e$i]->(n${i + 1})").mkString(";")
// (n1)-[e1]->(n2);(n2)-[e2]->(n3);(n3)-[e3]->(n4);(n4)-[e4]->(n5)
и выражение фильтра, чтобы избежать циклов:
val expr = (1 to 5).map(i => s"n$i").combinations(2).map {
case Seq(i, j) => col(i) !== col(j)
}.reduce(_ && _)
Наконец быстрая проверка:
gf.find(path).where(expr).show
// +-----+---+---+-----+---+-----+---+-----+---+
// | e1| n1| n2| e2| n3| e3| n4| e4| n5|
// +-----+---+---+-----+---+-----+---+-----+---+
// |[a,b]|[a]|[b]|[b,c]|[c]|[c,d]|[d]|[d,e]|[e]|
// |[b,c]|[b]|[c]|[c,d]|[d]|[d,e]|[e]|[e,f]|[f]|
// +-----+---+---+-----+---+-----+---+-----+---+