2015-04-03 3 views
0

Я новичок Scala. Я использую Google guava library Collections2.permutations() метод, который принимает на вход java.util.Collection collectionВзаимодействие между Scala.List и Java.util.List

У меня есть следующий код, адаптированный из соответствующей программы Java, которую я написал.

import java.util 

import com.google.common.collect.Collections2 
import collection.JavaConversions._ 

class OptimalTSP { 

    def distance(point1: Point, point2: Point): Double = { 
     Math.sqrt(Math.pow(point2.y - point1.y, 2) + Math.pow(point2.x - point1.x, 2)) 
    } 

    def findCheapestPermutation(points: java.util.List[Point]): java.util.List[Point] = { 
     var cost: Double = Double.MaxValue 
     var minCostPermutation: java.util.List[Point] = null 
     val permutations: util.Collection[java.util.List[Point]] = Collections2.permutations(points) 
     import scala.collection.JavaConversions._ 
     for (permutation <- permutations) { 
     val permutationCost: Double = findCost(permutation) 
     if (permutationCost <= cost) { 
      cost = permutationCost 
      minCostPermutation = permutation 
     } 
     } 
     println("Cheapest distance: " + cost) 
     minCostPermutation 
    } 
} 

Вышеприведенные отлично работает, но полное имя пакета java.util.List явно необходимо. Есть ли более идиоматический способ scala для этого, то есть передача scala List в метод, который ожидает Java Collection?

+0

Вы уверены, что [это] (http://stackoverflow.com/questions/8124440/code-to-enumerate- перестановки-в-скале) не лучшее решение? Есть уже метод для этого ... –

+0

@BoristheSpider Спасибо за указание, я адаптирую свой код на использование метода List напрямую – vsnyc

ответ

1

Более идиоматически, вы можете попробовать использовать permutations и minBy:

points.permutations.minBy(permutation => findCost(permutation)) 
points.permutations.minBy(findCost) //equivalent 
+0

Спасибо, это выглядит намного приятнее. Я попробую его и оставьте комментарий – vsnyc

+0

Проверено и принято – vsnyc

0

Как указал Борис в комментарии permutation метод на scala List, можно использовать, как показано ниже.

class OptimalTSP { 

    def distance(point1: Point, point2: Point): Double = { 
     Math.sqrt(Math.pow(point2.y - point1.y, 2) + Math.pow(point2.x - point1.x, 2)) 
    } 

    def findCheapestPermutation(points: List[Point]): List[Point] = { 
    var cost: Double = Double.MaxValue 
    var minCostPermutation: List[Point] = null 
    for (permutation <- points.permutations) { 
     val permutationCost: Double = findCost(permutation) 
     if (permutationCost <= cost) { 
     cost = permutationCost 
     minCostPermutation = permutation 
     } 
    } 
    println("Cheapest distance: " + cost) 
    minCostPermutation 
    } 
} 
Смежные вопросы