小编bin*_*ADa的帖子

更改优先级队列中项目的优先级

使用Scala 2.9实现一种Dijkstra算法(伪代码)

val queue = new PriorityQueue
queue.insert(...)
while (!queue.isEmpty) {
  val u = queue.extractMin
  queue.foreach { v =>
    if (condition(u, v))
      queue.decreaseKey(v, newPriority)
  }
}
Run Code Online (Sandbox Code Playgroud)

我想改变Scala中项目的优先级collection.mutable.PriorityQueue.

因此试图

  • 除去项目
  • 改变优先权
  • 重新插入队列.

但是我找不到一种方法来更新优先级或删除特定项目(不一定是头元素),就像从优先级队列java.util.PriorityQueue#remove(Object)删除项目一样.

  • 如何完成此任务scala.collection.mutable.PriorityQueue 或者我必须使用java.util.PriorityQueue

  • 有没有人知道这种方法是否缺乏设计,并且建议在更改某些项目的优先级后重建队列(可能需要查看有关优先级队列与动态项目优先级的讨论)?

algorithm heap scala priority-queue data-structures

15
推荐指数
1
解决办法
1万
查看次数

尽管有@specialized,但由于类型擦除导致重复的方法

偶然发现了

def foo(f: Int => Unit) {}
def foo(f: Long => Unit) {}
Run Code Online (Sandbox Code Playgroud)

由于没有编译method foo is defined twice.我知道上面只是一个简写

def foo(f: Function1[Int, Unit]) {}
def foo(f: Function1[Long, Unit]) {}
Run Code Online (Sandbox Code Playgroud)

并且在类型擦除之后,两种方法都具有相同的签名.

现在我已经阅读了在2.8.0 RC1尝试专用的Function1/Function2!Function1Function2拥有@specialized的版本Int,LongDouble在Scala 2.8.这无疑意味着,Function[Int, Unit]并且Function[Long, Unit]有独立的类文件在JVM的水平.

那么两个签名都不会有所不同吗?

问题是,第二种类型的参数会继续被删除吗?但同样的问题

class Bar[@specialized T]
def foo(f: Bar[Int]) {}
def foo(f: Bar[Long]) {}
Run Code Online (Sandbox Code Playgroud)

它没有编译.

scala type-erasure

6
推荐指数
1
解决办法
241
查看次数

Joda-Time:使用单个Formatter格式化多种格式

我想打印持续时间,以毫秒为单位,具有不同的格式规范,具体取决于其大小:

case (1)      "H:mm"  if duration < 10 hours
case (2)     "HH:mm"  if duration < 24 hours
case (3)  "#d HH:mm"  else (duration >= 24 hours)
Run Code Online (Sandbox Code Playgroud)

这意味着只有1小时的字段数字,持续时间低于10小时,
但有一个领先的日期字段时有2小时的字段数字!

例子:

case (1)      "0:45"  means 45 minutes,
              "1:23"  means 1 hour and 23 minutes,
case (2)     "12:05"  means 12 hours and 5 minutes and
case (3)  "1d 05:09"  means 1 day, 5 hours and 9 minutes
                               (= 29 hours and 9 minutes).
Run Code Online (Sandbox Code Playgroud)

我试过了

object JodaTest {
  import org.joda.time._
  private val pdf = …
Run Code Online (Sandbox Code Playgroud)

java formatting scala duration jodatime

5
推荐指数
1
解决办法
3626
查看次数

Scaladoc吞下了@throws和@note标签

在创建Scala文档时,我还使用了这里记录的@throws@note标签(Scaladoc Wiki - Tags and Annotations).

不幸的是我在生成的Scaladoc中找不到这些.

是否必须设置某些开关,考虑具体的事情或这是一个已知的问题?

顺便说一句:使用Scala 2.9.0.1 的scaladoc Ant任务也没有发出警告.

编辑: BTW2并澄清:我不是指@throws注释

@throws(classOf[RuntimeException])
def dispatch: Nothing = throw new RuntimeException
Run Code Online (Sandbox Code Playgroud)

这是在注释部分记录的,def@throwsScaladoc 的标签就像

/** @throws RuntimeException
 */
def dispatch: Nothing = throw new RuntimeException
Run Code Online (Sandbox Code Playgroud)

scala scaladoc

5
推荐指数
1
解决办法
1664
查看次数

Scala:Seq [T]元素的功能聚合=> Seq [Seq [T]](保留顺序)

我想在序列中聚合兼容元素,即将a转换Seq[T]Seq[Seq[T]]每个子序列中的元素彼此兼容的同时保留原始seq顺序,例如从

case class X(i: Int, n: Int) {
  def canJoin(that: X): Boolean = this.n == that.n
  override val toString = i + "." + n
}
val xs = Seq(X(1, 1), X(2, 3), X(3, 3), X(4, 3), X(5, 1), X(6, 2), X(7, 2), X(8, 1))
/* xs = List(1.1, 2.3, 3.3, 4.3, 5.1, 6.2, 7.2, 8.1) */
Run Code Online (Sandbox Code Playgroud)

想得到

val js = join(xs)
/* js = List(List(1.1), List(2.3, 3.3, 4.3), List(5.1), List(6.2, 7.2), List(8.1)) */
Run Code Online (Sandbox Code Playgroud)

我试图以功能的方式做到这一点,但我中途陷入困境:

做一个while循环 …

collections functional-programming scala

5
推荐指数
1
解决办法
252
查看次数

是否有foldLeft和for-yield的组合?

我必须处理订单序列(这里是Int为了简化):

// the handleOrder methods are in fact much more complicated:
def handleOrders(prev: Double, orders: Seq[Int]): Double = prev + orders.sum
def handleOrder(prev: Double, order: Int): Double = prev / order
Run Code Online (Sandbox Code Playgroud)

由于所谓的结果

def nextGroup(prev: Double, orders: Seq[Int]): Seq[Double]
Run Code Online (Sandbox Code Playgroud)

function我得到另一个类的序列(这里是Double为了简化).

由此我实现了两个版本.

版本1(foldLeft和显式构建器):

def nextGroup1(prev: Double, orders: Seq[Int]): Seq[Double] = {
  import collection.mutable.Builder
  import collection.immutable.VectorBuilder
  val bld: Builder[Double, Seq[Double]] = new VectorBuilder[Double]
  var first = true
  orders.foldLeft(prev) { (prev, order) =>
    val step = if (first) handleOrders(prev, orders) …
Run Code Online (Sandbox Code Playgroud)

collections scala yield fold

1
推荐指数
1
解决办法
583
查看次数