【问题标题】:compaire NSArray items with every other item in the NSArray将 NSArray 项与 NSArray 中的所有其他项进行比较
【发布时间】:2012-11-29 22:19:10
【问题描述】:

我有一个 NSArray 的 NSStrings 并且想知道如何将数组中的每个项目与数组中的每个其他项目进行比较以查看 是否有任何与其他字符串不同的字符串。。 p>

我看过一个c++例子

for (int i = 0; i < list.size(); i++) {
  for (int j = i+1; j < list.size(); j++) {
    // compare list.get(i) and list.get(j)
  }
}

但是如果在目标 C 中有更好更简单的方法,那是不是很伤人?我还需要做的另一件事是确保项目在循环时不会比较自身。

任何帮助或示例将不胜感激。

UPDATE ** BOLD 是问题的更新部分**

【问题讨论】:

  • 识别成对的字符串是你想要的吗?
  • 这似乎是对的。请注意,您需要isEqualToString: 来匹配ij 处的项目的内容== 是一个地址比较,只有当它们都是同一个对象时才保证匹配。
  • 哦,废话,我刚刚编辑了我的问题。如果有任何配对,则不应该是这样,而是相反。如果一个字符串与所有其他字符串不同,那么我的意思是用它做点什么。这将是一个 uitableview 单元格的高度变化,就好像数组中的每个字符串都是相同的,那么我将在视图顶部显示一个值,否则如果一个值不同,我将在其各自的值中显示每个值tableviewcells.. 我希望这是有道理的。
  • 最简单的方法是将它们全部插入一个 HashSet(呃,制作那个 NSMutableSet)。
  • @HurkNburkS 向你道歉;我想我的回答完全湿透了。

标签: objective-c ios nsarray


【解决方案1】:

如果我正确地阅读了您的问题,您想要只在列表中出现一次的字符串,对吗?

NSCountedSet *counted = [NSCountedSet setWithArray:list];
for (NSString *string in counted) {
    NSUInteger count = [counted countForObject:string];
    if (count == 1) {
        // process "string", it appears in the list just once
    }
}

如果您只想知道列表中是否有多个不同的值,请执行以下操作:

NSSet *set = [NSSet setWithArray:list];
if (set.count == 1) {
    // There is only one distinct value in the list
} else {
    // There is more than one distinct value in the list
}

【讨论】:

  • 很好,我只是想知道您有 2 个实例变量 x 和 y 并且您执行 x=@"apple"; y=@"apple" 并将它们添加到列表中。然后该集合很可能会将它们视为不同的,因为指针指向不同的内存地址。我认为最安全的方法是使用嵌套的 for 循环使用字符串 isEqualTo
  • @KaanDedeoglu 不,如果将xy 添加到集合中,则集合中仍然只有一个字符串@"apple" 的实例。这就是集合的重点。 isEqual: 返回 YES 的任何值都只会在集合中出现一次。
  • 酷,这就是我想知道的。那么是否可以说在集合中相等性检查是使用 NSObject 的 isEqual: 方法而不是简单的 == 检查?
  • 是的,这是真的。使用== 不会很有用。
【解决方案2】:

我会使用 NSMutableDictionary。这与“将两个列表合并为唯一值”非常相似,苹果文档实际上在某处解释了复杂的方式。我忘了我在哪里找到的,但简单的方法在这里:Merge two arrays while preserving the original array order

所以你要做的就是遍历所有内容,看看是否有一个键(设置为字符串),如果没有,通过 setObject: forKey: 方法添加一个,然后通过字典枚举或获取 allKeys 值之后。

【讨论】:

    【解决方案3】:

    使用两套。如果字符串进入第一组没有冲突,则将其添加到第二组。如果字符串在第一组中遇到冲突,则将其从第二组中删除。当您处理完所有字符串后,第二组包含唯一的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多