我有一个像这样的字符串"A. rahul VyAs"
我想删除"A."和"A"之后的空格 所以新的字符串将是"rahul VyAs"
我如何实现这一目标?
注意:虽然我的特定上下文是Objective-C,但我的问题实际上超越了编程语言的选择.此外,我将其标记为"主观",因为否则有人会抱怨,但我个人认为这几乎完全是客观的.此外,我知道这个相关的SO问题,但由于这是一个更大的问题,我认为最好将这个问题作为一个单独的问题.如果没有完全阅读和理解,请不要批评这个问题.谢谢!
我们大多数人都熟悉存储键值关联的字典抽象数据类型,无论我们将其称为地图,字典,关联数组,哈希等,这取决于我们选择的语言.字典的简单定义可以通过三个属性来概括:
任何其他属性可以说是特定用途的便利或专业化.例如,某些语言(尤其是脚本语言,如PHP和Python)模糊了字典和数组之间的界限,并确实为字典提供了排序.尽管这可能是有用的,但这种添加不是字典的基本特征.纯粹来说,字典的实际实现细节是无关紧要的.
对于我的问题,最重要的观察是枚举键的顺序没有定义 - 字典可以按照它最方便的顺序提供键,并且由客户端根据需要组织它们.
我创建了自定义词典,它们强加了特定的键排序,包括自然排序顺序(基于对象比较)和插入顺序.很明显,在SortedDictionary(我实际上已经实现过)中给前者命名了一些变体,但后者更成问题.我见过LinkedHashMap和LinkedMap(Java),OrderedDictionary(.NET),OrderedDictionary(Flash),OrderedDict(Python)和OrderedDictionary(Objective-C).其中一些更成熟,一些更符合概念.
LinkedHashMap是根据Java集合传统中的实现命名的 - "链接"因为它使用双向链表来跟踪插入顺序,而"哈希"因为它是HashMap的子类.除了用户不需要担心的事实之外,类名甚至不能指出它的作用.使用有序似乎是现有代码之间的共识,但是关于这个主题的网络搜索也揭示了"有序"和"有序"之间可理解的混淆,我感觉是一样的..NET实现甚至有一个关于明显误称的评论,并建议它应该是"IndexedDictionary",因为您可以在排序中的特定点检索和插入对象.
我正在设计一个框架和API,我希望尽可能智能地命名该类.从我的观点来看,索引可能会起作用(取决于人们如何解释它,并基于字典的广告功能),有序是不精确的,并且有太多混淆的可能性,并且链接 "是正确的"(对Monty Python道歉) ).;-)
作为用户,您最有意义的名称是什么?是否有一个特定的名称,确切地说明了该课程的作用?(如果合适的话,我不反对使用稍长的名字,比如InsertionOrderDictionary.)
编辑:另一个强大的可能性(在我的答案中讨论)是IndexedDictionary.我真的不喜欢"插入顺序",因为如果允许用户在特定索引处插入键,重新排序键等,则没有意义.
api-design objective-c naming-conventions chdatastructures data-structures
我遇到了与这个问题相同的问题.但是,我有一个后续问题.我似乎与原始提问者的情况相同:我有一个带有字典层次结构的plist,用于定义配置屏幕.这些是不是可变的,将留在整个应用程序相同.由于最初的讨论似乎集中在改变字典引起的问题,我必须要求确认:字典的顺序是否保证与plist中的相同,即读取时(使用initWithContentsOfFile)?如果字典永远不会改变,我可以在这种情况下使用allKeys来获得正确的键序列吗?
我正在使用我发现的教程中的NSDictionary,但我只是有一个简单的问题,为什么按字母顺序排序?
NSArray *array = [[NSArray alloc] initWithObjects:userName, nil];
NSArray *array2 = [[NSArray alloc] initWithObjects:@"Other Data", @"Second Entry", nil];
NSDictionary *temp =[[NSDictionary alloc] initWithObjectsAndKeys:array, @"Name", array2, @"A",nil];
self.sortedKeys =[[temp allKeys] sortedArrayUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
注意:请参阅预期输出与实际输出
#import<Foundation/Foundation.h>
int main()
{
system("clear");
NSDictionary *d1 = nil;
@autoreleasepool
{
d1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"AAA", [NSNumber numberWithInt:10],
@"BBB", [NSNumber numberWithInt:20],
@"CCC", [NSNumber numberWithInt:30],
nil];
}
for(NSNumber* n1 in d1) //I expected fast enumeration for NSDictionary to be based on the
//ascending order of the key but that doesn't seem to be the case
{
printf("key = %p"
"\t [key intValue] = %i"
"\t value = %s\n", …Run Code Online (Sandbox Code Playgroud) 如何有效地和惯用地设置一个值,unordered_map 并找出是否添加了新密钥:
#include <unordered_map>
#include <string>
int main() {
auto map = std::unordered_map<std::string, int>{{"foo", 1}, {"bar", 2}};
map["foo"] = 3;
// how to find out if a new key was added?
}
Run Code Online (Sandbox Code Playgroud)
我不能insert()直接使用,因为我想要覆盖该值,如果已经存在并且insert不这样做.我无法operator[]直接使用,因为它不提供有关是否添加新密钥的信息.
出于性能原因,我想避免在地图中进行两次搜索.
我在其他地方看到的一个技巧是获取引用并检查该值是否为默认构造:
auto& value = map["foo"];
if(value == 0) {
// am inserting a new key
}
value = 3;
Run Code Online (Sandbox Code Playgroud)
但我可以在我的地图中真正拥有默认构造值,因此默认构造值不是新密钥的良好指示.
到目前为止我能想出的最好的是:
auto size_before = map.size();
map["foo"] = 3;
if (map.size() > size_before) {
// am inserting a new …Run Code Online (Sandbox Code Playgroud) 我的情况:
我有一个NSDictionary对象.由NSNumber提供.值是自定义对象.
我想将字典值放入UITableView.据我所知,UITableView要求对其源集合进行索引,以便在调用cellForRowAtIndexPath时,可以使用indexPath查找该值.
问题是当调用didSelectRowAtIndexPath时,我想从字典中查找对象,但是我没有密钥.我只有indexPath.row.
我的解决方案:我创建了一个键数组.我使用数组的索引来获取密钥,然后使用密钥将对象从字典中取出.
我的问题:这似乎有点草率,特别是因为这是一个例行任务(填充UITableView然后当有人触摸一个单元格时响应).这是它的设计方式还是更好的方式?
我只想要一个类似于a的数据结构Dictionary,但不仅可以使用键访问值,还可以使用值访问键.
所以它会是这样的:
let dict: ReversibleDictionary<String, String> =
["1" : "one", "2" : "two", "3" : "three"]
dict.valueFromKey("1") // "one"
dict.keyFromValue("two") // "2"
Run Code Online (Sandbox Code Playgroud)
有没有内置的swift?
如果没有,我怎么能自己创造这样的东西呢?
我尝试使用2 NSMutableOrderedSets 创建一个并使用线性搜索来查找相应的值.但我认为使用线性搜索效率太低,这是O(n)复杂度.访问字典应该是O(1)复杂性,对吧?
首先,这是我的代码:
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:url]];
NSData *response = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil error:nil];
NSDictionary *publicTimeline = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];
for (NSObject* key in publicTimeline) {
id value = [publicTimeline objectForKey:key];
NSLog(@"%@", key);
}
Run Code Online (Sandbox Code Playgroud)
我在网络服务上收集了一些新闻,并在tableView中显示它.
我的问题是这些新闻没有按顺序显示.
在我的网络服务中,新闻是有序的,例如我有:
{"0":{"title":"News1"}}
{"1":{"title":"News2"}}
{"2":{"title":"News3"}}
Run Code Online (Sandbox Code Playgroud)
等等..
但是在循环中,我"松散"了这个顺序:/我希望按此顺序获得我的新闻,首先是"1"之后索引为"0"的新闻等...
(NSDictionary似乎放弃了这个顺序,例如,在我的代码之后,我在我的tableview中,新闻:"2","0","1",而不是我的新闻"0","1"," 2".)
(我尝试了一些答案,但似乎没有一个在我的情况下工作:()
SOmeone来帮助我吗?谢谢,
objective-c ×6
iphone ×4
cocoa-touch ×2
dictionary ×2
nsdictionary ×2
api-design ×1
c++ ×1
c++11 ×1
cocoa ×1
hashmap ×1
ios ×1
nsstring ×1
sorting ×1
swift ×1
uitableview ×1
xcode ×1