- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个字典数组,类似于以下内容:
( { Black = "?"; Date = "????.??.??"; Result = "*"; SourceDate = "2007.10.24"; White = "Mating pattern #1"; }, { Black = "?"; Date = "????.??.??"; Result = "*"; SourceDate = "2008.10.24"; White = "About this Publication"; })
I want to offer the user the ability to search for text either within just the "White" and "Black" fields, or within any field. I've got an NSPredicate for doing just the specific fields:
predicate = [NSPredicate
predicateWithFormat:@"self.Black contains[cd] %@ or self.White contains[cd] %@",
searchText, searchText];
[filteredGames addObjectsFromArray:[games filteredArrayUsingPredicate:predicate]];
我想不出如何表达一个谓词,它会返回字典中的任何对象与文本匹配的字典。即我可以搜索“2007”,它会返回第一本字典而不是第二本。我尝试了“self.*”,我并没有真正期望它能工作,也尝试了“ANY self.allValues”,这是我更有希望的。我实际上事先并不知道键是什么,因此需要一些不太具体的东西。
有什么建议吗?
最佳答案
如果所有的字典都有相同的键集,那么你可以做一些非常简单的事情:
NSArray *keys = ...; //the list of keys that all of the dictionaries contain
NSMutableArray *subpredicates = [NSMutableArray array];
for (NSString *key in keys) {
NSPredicate *subpredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", key, searchText];
[subpredicates addObject:subpredicate];
}
NSPredicate *filter = [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates];
然后您可以使用filter
来过滤您的NSArray
(使用-filteredArrayUsingPredicate
)。
如果,另一方面,你有一个任意字典数组,它们都有不同的键,你需要一些更反常的东西:
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(FUNCTION(SELF, 'allKeys'), $k, SELF[$k] contains[cd] %@).@count > 0", searchText];
一些关于它在做什么的信息:
FUNCTION(SELF, 'allKeys')
- 这将在 SELF
上执行 -allKeys
(NSDictionary
) 并返回字典中所有键的 NSArray
SUBQUERY(allKeys, $k, SELF[$k] contains[cd] %@)
- 这将遍历 allKeys
中的每个项目,每个连续项目被放入 $k
变量中。对于每个项目,它将执行 SELF[$k] contains %@
。这基本上最终会做:[theDictionary objectForKey:$k] contains[cd] %@
。如果返回 YES
,则 $k
项将聚合到一个新数组中。SUBQUERY(...).@count > 0
- 在找到与包含您的搜索文本的值相对应的所有键后,我们检查并查看是否有任何键。如果存在(即数组的大小大于 0),则整个字典将成为最终过滤数组的一部分。如果可能的话,我建议使用第一种方法。 SUBQUERY
和 FUNCTION
有点神秘,第一个更容易理解。
这是另一种方式,您实际上几乎在问题中遇到过这种方式。除了执行 ANY SELF.allValues contains[cd] %@
,您还可以执行 ANY FUNCTION(SELF, 'allValues') contains[cd] %@
。这相当于我的 SUBQUERY
疯狂,但更简单。感谢您考虑使用 ANY
(我通常会忘记它的存在)。
编辑
SELF.allValues
不起作用的原因是,这被解释为键路径,并且 -[NSDictionary valueForKey:]
is supposed to be the same as -[NSDictionary objectForKey:]
。这里要注意的是,如果您在 key 前加上 @
,它就会转发到 [super valueForKey:]
,将执行您的操作正在期待。所以你真的可以这样做:
ANY SELF.@allValues contains[cd] %@
或者简单地说:
ANY @allValues contains[cd] %@
这会起作用(并且是最好和最简单的方法)。
关于ios - NSPredicate 匹配 "any entry in an NSDatabase with value that contains a string",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5569632/
Eclipse 提示此代码“类型参数 Entry 隐藏了类型 Map.Entry”: import java.util.Map.Entry; public class Test { stat
这两个for语句是等价的。 import java.util.Map; import java.util.Map.Entry; for (Map.Entry entry: map.entrySet()
我想在 python 字典中添加一个键/值,它依赖于现有的键/值。示例 x = {} x["length"] = 12 x["volume"] =x["lenght"] * 10 行得通;但是有没有可
我使用 NuGet 将我的 EntityModel 升级到版本 4.3。 现在我想更改我的 EntityObject.State,但找不到 .Entry() 方法。 当前状态是已删除。 这就是我想要做
我是 Java 新手,正在使用 HashMap 在 Mac 上编写 Java。 但是我遇到了一个问题,找不到答案 import java.util.Map; import java.util.Hash
我正在切换一个小应用程序(Win 7/64 上的 Python 2.7.3/32)来使用 ttk,但我在使 ttk.Entry 按照 tk.Entry 的方式工作时遇到问题;当我设置其内容时,ttk.
为什么我需要在 i.next(); 前面加上 (Map.Entry) ?为什么我不能只有 Map.Entry m = i.next();? 对不起。它是一个 HashMap。 最佳答案 因为它显然不是
我的 xPage SSJS 失败: viewEntry = view.getNext(viewEntry); 有错误 Notes error: Entry not found in index 我确实
我正在使用 DataTable在我的申请中。 我想隐藏左下角的细节,我该怎么做? “显示 1,657 个条目中的 1 到 10 个(从 9,044 个条目中筛选出来)” 这是我的设置: $('#inv
我有两列,一个时间戳和一个已选择卡片的数字。 card added 1 2016-09-23 13:48:48 3 2016-09-23 13:48:48 1
我正在使用 Entity Framework 4.1,并且我有我的 DbContext Override SaveChanges 来审核属性更改。从“GetEntryValueInString”返回空
我正在使用 Tkinter 在 Python 3 上编写 GUI,但每次使用 Entry() 时,我都会收到名称错误。 我尝试了一个更简单的代码版本,(写在下面),但它仍然导致了 NameError:
我刚刚创建了一个插入方法来对数组进行排序,这是我在该方法中完成的代码; public static void insertionSort (Entry[] array2){ for (int
使用这个例子1对于 n:n 关系: (来源:tekstenuitleg.net) 设置主要或主要多对多字段的最佳方法是什么?示例:假设我想将经销商“Devrolijke drinker”(ID AB9
是否可以使用 Entry 通过 AsRef 获取值的 API , 但用 Into 插入它? 这是工作示例: use std::collections::hash_map::{Entry, HashMa
是否可以使用 Entry 通过 AsRef 获取值的 API , 但用 Into 插入它? 这是工作示例: use std::collections::hash_map::{Entry, HashMa
是否可以使用 Entry 通过 AsRef 获取值的 API , 但用 Into 插入它? 这是工作示例: use std::collections::hash_map::{Entry, HashMa
表定义: CREATE TABLE PositionalDataNGS ( Date DATE, Time TIME(3) , X FLOAT(5), Y FLOAT(5), D FLOAT(5) ,
我的平台: PHP 和 MySQL 我这里有什么: 我有 4 个表,分别是“books”、“book_type”、“book_categories”、“all_categories”。 我想做什么:
I am using MySQL 5.1.56, MyISAM. My table looks like this:我使用的是MySQL 5.1.56,MyISAM。我的桌子是这样的: CR
我是一名优秀的程序员,十分优秀!