我有一个 NSMutableArray oldArray。现在,在某一时刻,这个 NSMutableArray 对象被另一个 NSMutableArray 更新,它可能有更多、更少或相同数量的元素作为前一个 NSMutableArray.
我想比较新旧数组的变化。我想要的是两个 NSArrays addedArray 和 removedArray ,它们将包含已添加和/或从旧元素中删除的元素的索引大批。
举个例子,整个问题会更清楚:
oldArray = {@"a",@"b",@"d",@"e",@"g"};
newArray = {@"a",@"c",@"d",@"e",@"f",@"h"};
因此,这里删除的对象分别是索引 1 和 4 处的 @"b"和 @"g"。添加的对象是索引 1、4 和 5 处的 @"c"、@"f"和 @"h"(首先删除对象,然后添加)。
因此,
removedArray = {1,4}; and addedArray = {1,4,5};
我想要一种有效的方法来从旧的和新的 NSMutableArray 中获取这两个数组 - removedArray 和 addedArray。谢谢!如果问题不是很容易理解,我愿意提供更多信息。
编辑 1
如果我解释一下我想用它做什么,也许会更清楚。
实际上,我使用它的目的是在加载 tableview 后使用动画方法 insertRowsAtIndexPaths 和 removeRowsAtIndexPaths 更新 UITableView,以便用户可以看到删除的行出去,新行进来。 tableview 存储用户可以添加或删除的收藏夹元素。所以在添加了一些收藏夹并删除了一些之后;当用户返回到收藏夹 TableView 时,将显示动画。
编辑 2
早该提到这一点,但是旧数组和新数组中的元素都会按升序排列。只有删除或添加的索引很重要。订单不能更改。前任。 {@"b",@"a",@"c",@"d"} 不能是数组。
最佳答案
I have tried iterating through the old and the new arrays using loops and if conditions, but is it getting really messy and buggy.
这不是一个简单的问题。首先,请注意它可能有多种解决方案:
a b c d
b c d e
(a={0, 1, 2, 3}, r={0, 1, 2, 3}) 和 (a={3}, r={ 0}) 是有效的解决方案。您可能正在寻找的是一个最小解决方案。
获得最小解的一种方法是找到 Longest Common Subsequence (LCS)的两个序列。查找 LCS 的算法会告诉您两个序列中哪些元素属于 LCS,哪些不属于。不在 LCS 中的原始数组的每个元素的索引进入 removed 数组;不在 LCS 中的新数组元素的索引进入 added 数组。
这里有几个例子(我把LCS的元素用括号括起来了):
0 1 2 3 4 5
(a) b (d) (e) g
(a) c (d) (e) f h
不在LCS中的old项目是1和4;不在 LCS 中的 new 项目是 1、4 和 5。
这是另一个例子:
0 1 2 3
a (b) (c) (d)
(b) (c) (d) e
现在 added 是 3 而 removed 是 0。
关于ios - 找出 NSArray/NSMutableArray 变化的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316438/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
使用Ruby1.8.6/Rails2.3.2我注意到在我的任何ActiveRecord模型类上调用的任何方法都返回nil而不是NoMethodError。除了烦人之外,这还破坏了动态查找器(find_by_name、find_by_id等),因为即使存在记录,它们也总是返回nil。不从ActiveRecord::Base派生的标准类不受影响。有没有办法追踪在ActiveRecord::Base之前拦截method_missing的是什么?更新:切换到1.8.7后,我发现(感谢@MichaelKohl)will_paginate插件首先处理method_missing。但是will_pa
假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum
在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已