【问题标题】:How to filter one array of strings based on the contains of a second array of strings如何根据第二个字符串数组的包含过滤一个字符串数组
【发布时间】:2015-12-17 19:08:33
【问题描述】:

已解决,我无法选择自己的答案

我有一个从JSON 加载到NSMutableArray 的数组。其中一个条目AllowedTo 的值为New York, Florida

我还有第二个数组,它从一个单独的 JSON 传入一个新的 NSMutableArray,并使用这个数组填充一个 UITableView

使用第一个数组,我想隐藏第二个数组中不匹配的任何单元格。例如,最终结果将(使用上面发布的图像)只有 3 个单元格(总计、纽约、佛罗里达州),其余的(JUNIORS、FOODATION 等)将被隐藏。

【问题讨论】:

  • 看来您的问题是关于使用数组,而不是关于 UITableView,是吗?如果是这样,请重新表述您的问题 - 删除任何不需要的内容(如表格视图)并阐明您需要什么。
  • 如果你指的是标签,我使用了推荐的任何东西。生病删除它,因为我认为合适。对此感到抱歉

标签: ios objective-c arrays json filter


【解决方案1】:

这是一个使用filter function 的示例。

    let arrayOne = ["one", "two", "three", "four", "five"]
    let arrayTwo = ["one", "two", "three"]


    let filteredArray = arrayOne.filter({ arrayTwo.contains($0)})

    print("filteredArray: \(filteredArray)")

然后我会为此创建一个函数,以便您可以根据需要调用它,而无需更改原始数组。

func filterDataSource(arrayOne: [String], arrayTwo: [String]) -> [String] {

    let filteredArray = arrayOne.filter({ arrayTwo.contains($0)})

    return filteredArray

}

编辑

Objective-C 中的功能相同,有更优雅的方法,但我有点生疏:)

NSArray *arrayOne = @[@"one", @"two", @"three", @"four", @"five"];
NSArray *arrayTwo = @[@"one", @"two"];


NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity:5];

for (NSString *string in arrayOne) {
    for (NSString *filterString in arrayTwo) {

        if ([string isEqualToString:filterString]) {
            [filteredArray addObject:string];
            continue;
        }
    }

}

【讨论】:

  • 任何可能的 obj-c 版本。我还没有研究 swift
  • 一个小问题,主要是我的错,两个可变数组都是字典。我将如何在字典中获取数组的字符串,例如,arrayOne.AllowedTo......编辑:我脑残了。我知道这个大声笑。谢谢你的帮助。一旦我得到它的工作,我会标记你的答案
【解决方案2】:

你也可以使用集合:

NSMutableSet *dataToShow = [NSMutableSet setWithArray:yourFirstArray];
NSSet *other = [NSSet setWithArray:yourSecondArray];
[dataToShow intersectSet:other];

现在“dataToShow”只有两个数组中都存在的项目。

编辑

例如:

Array1 有 "1", "2", 3", "4"

Array2 有“1”、“4”、“5”

Set1 将包含 Array1 的元素,但顺序可能不同:“2”、“4”、“3”、“1”

Set2 相同:"4", 1", "5"

相交的集合“dateToShow”将包含元素“1”和“4”,因为它们是两个集合中唯一存在的元素。

但是,无法保证顺序,所以如果这对您很重要...我建议 [dataToShow.allObjects sortedArrayUsingComparator....];

【讨论】:

  • 我想要做的是,如果 arrayOne.AllowedTo = arrayTwo.EntityName,将其添加到 newArray 并使用 newArray 填充表。可以用 Sets 完成吗?我以前从未使用过它们
  • 我不确定我是否遵循您的数据结构,但 Set 有点像数组,只是它是无序的并且其中的项目是唯一的。所以我建议您为 2 个数组中的每一个创建一个集合,然后利用 intersect 功能来获取共同的元素。然后,您可以为您的表获取相交集的“allObjects”数组,尽管您可能需要对其重新排序。
【解决方案3】:

所以,我看错了。我的意图是将 JSON 解析到一个数组中,然后去掉我不需要的东西。当只用我想要显示的内容填充数组时要简单得多。在我的 JSON 解析器的末尾,我添加了这个

if ([AllowedTo containsString:newEstNet.EntityName]) {
    NSLog(@"%@ displayed", newEstNet.EntityName);
    [listOfEstNetGrand addObject:newEstNet];
} else {
    NSLog(@"%@ not displayed", newEstNet.EntityName);
    // dont add the object to the array
}

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多