代码之家  ›  专栏  ›  技术社区  ›  ALz

搜索并找到一个短语,得到它前面和后面的两个单词

  •  0
  • ALz  · 技术社区  · 7 年前

    我使用以下代码在数组中搜索UISearchBar中键入的短语,然后将在其中找到短语的索引内容添加到将显示在表视图中的数组中。

    -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)enteredSearchText{
    
    
        if ([enteredSearchText length] == 0) {
    
            [wholeTextOfDoaasLive removeAllObjects]; //wholeTextOfDoaasLive is an NSMutableArray
    
        }
        else{
    
            [wholeTextOfDoaasLive removeAllObjects];
    
            for (NSString * string in AllWholeText) {//AllWholeText is an NSMutableArray
    
                NSRange r = [string rangeOfString:enteredSearchText options:NSCaseInsensitiveSearch]; 
    
                if (r.location != NSNotFound){
    
                    [wholeTextOfDoaasLive addObject:string];
                }
            }
        }
    
        [_searchResultsTable reloadData];
    }
    

    然而,AllWholeText数组的每个索引都包含大量文本,我不想将整个对象(在其中找到搜索短语)添加到wholeTextOfDoaasLive数组中。相反,我只想将找到的短语加上前后两个单词添加到我的wholetextodaaslive数组中。我该怎么做?

    1 回复  |  直到 7 年前
        1
  •  0
  •   ALz    7 年前

    所以我写了这段代码,它只是把搜索到的短语放到上下文中,如果它接近段落的末尾(数组索引内的段落),那么它会显示为“很少”单词 在tableview单元格中,如果不在末尾,则显示“很少”单词 .

    -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)enteredSearchText{
    
        if ([enteredSearchText length] == 0) {
    
            [wholeTextOfDoaasLive removeAllObjects];
    
        }
        else{
    
            [wholeTextOfDoaasLive removeAllObjects];
    
            for (NSString * string in AllWholeText) { //create string that holds the value in that index
    
                NSRange r = [string rangeOfString:enteredSearchText options:NSCaseInsensitiveSearch]; 
    
                NSUInteger indexOfFoundString = r.location;
                NSUInteger numberOfAvailableCharactersAfterPhrase = string.length - (indexOfFoundString + 1 );
    
                NSUInteger takeCharacters = 50; //number of characters that will show in tableview cell
                foundStringIsAtTheEnd  =NO;
    
                /// START: eliminate the "out of bounds" error ///
                // if the searched phrase is at the end of the text and you ask for 50 characters after it, the app to crash. So here we check if the searched phrase is the near the end or if it's far away from the end. A) if it's close to the end then show words before it. B) if it's far from the end then show words after it.
    
                if (numberOfAvailableCharactersAfterPhrase < 50) {
                    takeCharacters = 40;
    
                    if (numberOfAvailableCharactersAfterPhrase < 40) {
                         takeCharacters = 30;
    
                        if (numberOfAvailableCharactersAfterPhrase < 30) {
                            takeCharacters = 20;
    
                            if (numberOfAvailableCharactersAfterPhrase < 20) { //there is less than 20 characters after the searched phrase
    
                                takeCharacters = numberOfAvailableCharactersAfterPhrase+30;
                                foundStringIsAtTheEnd  =YES;
    
                            }
    
                        }
                    }
                }
                /// END: eliminate the "out of bounds" error ///
    
                if (indexOfFoundString != NSNotFound){
    
                    NSString *tableViewString;
    
                    if (foundStringIsAtTheEnd == YES) {
    
                        indexOfFoundString -= 30; //to show few words before the searched phrase
    
                        tableViewString = [string substringWithRange:NSMakeRange(indexOfFoundString, takeCharacters)];
    
                        /// START: remove cropped words, we want only full words ///
                        NSArray *arrayStoredText = [tableViewString componentsSeparatedByString:@" "];
                        NSMutableArray *myMutable = [[NSMutableArray alloc]initWithArray:arrayStoredText];
                        [myMutable removeObjectAtIndex:0]; //cuz maybe it's a cropped word
                        tableViewString = @"";
                        tableViewString = [myMutable componentsJoinedByString:@" "];
                        /// END: remove cropped words, we want only full words ///
    
    
                    }
                    else{ //if searched phrase is far from the end
    
                        tableViewString = [string substringWithRange:NSMakeRange(indexOfFoundString, takeCharacters)];
    
                        NSArray *arrayStoredText = [tableViewString componentsSeparatedByString:@" "];
                        NSMutableArray *myMutable = [[NSMutableArray alloc]initWithArray:arrayStoredText];
                        [myMutable removeLastObject]; //cuz maybe it's a cropped word
                        tableViewString = @"";
                        tableViewString = [myMutable componentsJoinedByString:@" "];
    
                    }
    
                    [wholeTextOfDoaasLiveArray addObject:tableViewString];
                }
            }
        }
    
        [_searchResultsTable reloadData];
    }