草庐IT

关于集合:scala 附加到可变的 LinkedList

codeneng 2023-03-28 原文

scala append to a mutable LinkedList

请检查这个

1
2
3
4
5
6
7
8
9
import scala.collection.mutable.LinkedList

var l = new LinkedList[String]

l append LinkedList("abc","asd")

println(l)
// prints
// LinkedList()

但是

1
2
3
4
5
6
7
8
9
10
import scala.collection.mutable.LinkedList

var l = new LinkedList[String]

l = LinkedList("x")
l append LinkedList("abc","asd")

println(l)
// prints
// LinkedList(x, abc, asd)

为什么第二个代码片段有效,而第一个无效?这是在 Scala 2.10


文档说 If this is empty then it does nothing and returns that. Otherwise, appends that to this.。这正是你观察到的。如果你真的需要一个可变列表,我建议你使用 scala.collection.mutable.ListBuffer 代替,你可以这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
val lb = new ListBuffer[Int]

scala> lb += 1
res14: lb.type = ListBuffer(1)

scala> lb
res15: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)

scala> lb ++= Seq(1,2,3)
res17: lb.type = ListBuffer(1, 1, 2, 3, 1, 2, 3)

scala> lb
res18: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 1, 2, 3, 1, 2, 3)

  • 但为什么会有这种行为?为什么不附加到 self 而不管元素的数量?这不是 mutable 集合所期望的吗?
  • Hinestly我没有一个想法。如果你想知道确切的原因,你应该试试官方的 scala 邮件列表。
  • 我的猜测是因为它比实际修改列表便宜得多。虽然,恕我直言,这打破了突变操作实际上会改变列表的隐含合同。
  • new LinkedList[String]LinkedList[String]() 不一样不是吗?


据我了解,它与列表中的第一个/最后一个 (Nil) 元素有关(如果列表为空 Nil 同时是第一个和最后一个元素)。

LinkedList(仍然)遵循"原始魅力"策略。因此它不会尝试在 Nil 之后添加/追加新数据,从而可能产生如下结果:{Nil, newElement}。 (毕竟 Nil 应该是最后一个元素)

当然可以检查if列表是否为空,然后将addingList放在开头,Nil放在结尾。但这将是"太聪明了",我猜。

但是,无论如何 append() 返回"预期"结果就像这样:

1
2
val addingList = new LinkedList[String]("a","b")
val result = emptyList append addingList

result = {"a","b"}. 在这种情况下,它会返回 'addingList' 本身,并且/但不会更改初始列表。

如果我们尝试将 newElement 分配给 next ref:

1
   emptyList.next = LinkedList("whatever")

因此,我们将 emtyList 更改为:

1
 LinkedList(null, whatever)

即它将第一个元素创建为 null,因为我们使用 next() 为其分配新/下一个元素。所以它将 Nil 移动到最后,因为第一个为 null 的元素具有对我们添加的新元素 (addingElelement) 的下一个引用。

因为

"the"emptyList" is also the"head" link"

和 head 在我们的例子中 head 是 Nil,但是 Nill 不能有下一个,所以它必须创建新的第一个元素(它具有空值), next() 引用我们的新 addingElelement

我个人觉得它"太原始"而不是"那么优雅"。但这取决于,我猜。

以任务为导向的故事:

对于我的初始任务(为什么我开始考虑这种"奇怪"的列表行为[即使它是可变的])——我想为一个名为 Dictionary 的类/对象使用可变列表,它会保留 Words它(字典默认没有任何单词)。我会有像 addWord(wod:String) 这样的方法来添加新词。现在我的实现将被更改(我不会使用这个 LinkedList,而是使用 MutableList。它似乎比以前的更易变):

1
2
3
4
5
6
7
8
9
object Dictionary {

  val words = new mutable.MutableList[Word]();

  def addWord(word: Word): Unit = {
    words += word;
  }

}

但可能的实现可能是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
object Dictionary {

  var words = new mutable.LinkedList[Word]();

  def addWord(word: Word): Unit = {

    if (words.isEmpty) {
      words = words append( mutable.LinkedList[Word](word) ) // rely on append result
    } else {
      words append( mutable.LinkedList[Word](word) )
    }

  }

}

但后来我必须用var而不是val,而且我要把每一个新词都转换成LinkedList,我的逻辑变得更复杂了。

有关关于集合:scala 附加到可变的 LinkedList的更多相关文章

  1. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  2. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  3. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  4. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  5. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  6. ruby - 如何测试 Ruby 对象是否不可变? - 2

    有没有一种简单的方法来测试一个对象是不可变的(数字,零)还是不可变的(数组,哈希,对象)?换句话说,是否可以通过其他代码的副作用更改它?动机:我想创建一个版本化的值存储,但有些数据是数组。一些数组将存储自定义对象,我可以通过存储“in”属性并搜索它来反转关系。但我也希望能够存储符号数组、其他数组等。 最佳答案 我发现了一个低效的方法:classObjectdefprimitive?beginself.dupfalserescueTypeErrortrueendendend 关于ruby-

  7. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  8. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  9. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  10. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

随机推荐