Я пытаюсь преобразовать сортировку выбора из Java в Scala и im unsure, как преобразовать этот цикл в Scala:
for (int j = i + 1; j < N; j++)
Вот пример кода Java и его эквивалент Scala:
Java:
sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{
int min = i
for (int j = i + 1; j < N; j++)
}
Scala:
def sort(a : Array[Ordered[Any]]) = {
var N = a.length
for (i <- 0 until N) {
var min = i
for(j <- until j < N){
}
}
}
Как преобразовать внутренний цикл в Scala?
for (int j = i + 1; j < N; j++)
Я не знаю, как выполнять присваивание при повторении...
Здесь вы идете:
def sort(a : Array[Ordered[Any]]) = {
val N = a.length
for (i <- 0 until N) {
var min = i
for(j <- i + 1 until N){
}
}
}
Кроме того, в Scala вы можете определять значения внутри для понимания и объединять несколько блоков в один:
def sort(a : Array[Ordered[Any]]) = {
val n = a.length
for(i <- 0 until n; min = i; j <- i + 1 until n) { // min here is val, not var
// do something with i, j and min
}
}
Иногда это может привести к созданию более чистого кода
К сожалению, стандарт для циклов довольно медленный на Scala (особенно со старой версией).
Альтернативой является классический цикл while, даже если это не так ясно:
def sort(a : Array[Ordered[Any]]) = {
val N = a.length
var i = 0;
while (i < N) {
var min = i
var j = i + 1;
while (j < N) {
j += 1;
}
i += 1;
}
}
Или хвостовые рекурсивные функции:
def sort(a : Array[Ordered[Any]]) = {
val N = a.length
def l1(i: Int){
def l2(j: Int, min: Int){
if (j < N)
l2(j+1, min)
}
if (i < N) {
l2(i+1, i);
l1(i+1);
}
}
}
Или cfor шпиля:
def sort(a : Array[Ordered[Any]]) = {
val N = a.length
cfor(0)(_ < N, _ + 1) { i =>
var min = i
cfor(i+1)(_ < N, _ + 1) { j =>
}
}
}
Использование для циклов (не совсем функциональный/идиоматический способ scala) для итерации будет очень похож на код Java. Это поможет вам.
def sort(a: Array[Comparable]) {
val N = a.length
for (
i <- 0 until N;
min = i;
j <- (i + 1) until N
) {
// more code..
}
}
Вот ваш код Java для справки:
sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{
int min = i
for (int j = i + 1; j < N; j++)
}