2015-12-11 3 views
-3

У меня есть следующий код Scala, в котором z представляет массив строк с каждой строкой, представляющей набор данных набора данных.
Первым шагом является вычисление совпадающего балла между первой строкой в ​​наборе данных со всеми остальными строками в наборе данных, после чего сохраняются все аналогичные строки в одном наборе.
Второй шаг - рассчитать совпадение второй строки, которая не соответствует первому шагу, со всеми другими непревзойденными строками в наборе данных.
Третий и последующие шаги, как и предыдущие шаги.

Самое главное, что мне нужно заботиться о том, чтобы все строки, соответствующие этим процессам, не участвовали в дальнейших циклах, поскольку они были сопоставлены на предыдущих шагах.
Предложить изменения в коде, чтобы все мои требования были выполнены.Изменения кода Scala для алгоритма

val z = y.split("\n")  // z is Array[String] 

for (i <- 1 to 500) 
{ 

var str = ArrayBuffer[String]() 
    str += z(i) 

for(j <- 1 to 500) 
{   

    val dist = match(z(i),z(j)) // match calculates score between 2 strings 

    if (dist < threshold){ 

     str += z(j)  
} 
} 
+0

Возможно, вы захотите попробовать codereview.stackexchange для 'предложений' – bholagabbar

+3

@ShreyansSheth Code Review не предлагает предложений по изменению способа работы кода, это просто для просмотра кода, который уже работает по назначению. – SuperBiasedMan

ответ

2

Scalish подход, который может передать предназначенную семантику, как этого

val xs = y.split("\n") 
val res = 
    for { zi <- xs 
     zj <- xs 
     if score(zi,zj) < threshold 
     } 
    yield zj 

res.mkString 

А именно, для каждого zi и каждый zj в строке знака, фильтровать те пары, чьи скоринг является меньшим, чем threshold, а затем вывести второй элемент из каждой пары.

Примечание. Для этого не требуются индексированные ссылки или измененные коллекции.

Смежные вопросы