美文网首页iOS开发小技巧
iOS比对字符串获取不同字符位置

iOS比对字符串获取不同字符位置

作者: 整个夏天 | 来源:发表于2020-02-27 12:32 被阅读0次

需求

在用户提交的修改内容需要标注出哪些字符是有变化的,然后标红显示

思路

从原始字符串的第0位开始扫描截取,分别对比修改后的字符串的相同位置,找出相同字符串位置,然后再反转位置得出不同字符串位置

例子

原始字符串:good
修改后字符串:goods

  1. 0开始,长度为1,等到g字符串,对比修改后字符串的相同位置
  2. 字符相同,则再从0开始,长度为2,得到字符串go,依次类推得到的相同字符串位置为location:0,lenth:4,字符串为good
  3. 以相同字符串的坐标为基础推算出不同字符串的位置即可

代码

//
//  StringCheckHelp.h
//  word
//
//  Created by apple on 2020/1/8.
//  Copyright © 2020 stonemover. All rights reserved.
//

#import <Foundation/Foundation.h>



@interface StringCheckHelp : NSObject

+ (NSMutableArray *)check:(NSString*)strOri changeStr:(NSString*)changeStr;

@end


@interface StringCheckModel : NSObject

@property (nonatomic, assign) NSInteger start;

@property (nonatomic, assign) NSInteger end;

@property (nonatomic, assign) NSInteger lenth;

@property (nonatomic, strong) NSString * str;

@end


//
//  StringCheckHelp.m
//  word
//
//  Created by apple on 2020/1/8.
//  Copyright © 2020 stonemover. All rights reserved.
//

#import "StringCheckHelp.h"

@implementation StringCheckHelp

+ (NSMutableArray *)check:(NSString*)strOri changeStr:(NSString*)changeStr{
    if (!strOri) {
        strOri = @"";
    }
    
    if (!changeStr) {
        changeStr = @"";
    }
    NSMutableArray * dataArrayGood = [NSMutableArray new];
    if ([strOri isEqualToString:changeStr]) {
        NSLog(@"没有不同");
        return dataArrayGood;
    }
    
    NSMutableArray * array = [NSMutableArray new];
    
    for (NSInteger startIndex = 0; startIndex<strOri.length; startIndex) {
        NSInteger len = 1;
        NSString * headStr = [strOri substringWithRange:NSMakeRange(startIndex, len)];
        BOOL isHad = NO;
        while ([changeStr containsString:headStr]&&len<strOri.length-startIndex) {
            isHad = YES;
            len++;
            headStr = [strOri substringWithRange:NSMakeRange(startIndex, len)];
        }
        if (isHad) {
            NSString * resultStr = nil;
            if (startIndex + len == strOri.length && [changeStr containsString:headStr]) {
                resultStr = headStr;
                startIndex = startIndex + len;
            }else{
                resultStr = [strOri substringWithRange:NSMakeRange(startIndex, len-1)];
                startIndex = startIndex + len-1;
            }
            
            NSRange range = [changeStr rangeOfString:resultStr];
            NSLog(@"开始位置:%ld, 长度:%ld,相同字符串:%@",range.location,range.length,resultStr);
            
           
            StringCheckModel * model = [StringCheckModel new];
            model.start = range.location;
            model.end = range.location + range.length;
            model.lenth = range.length;
            model.str = resultStr;
            
            NSMutableArray * dataRemove = [NSMutableArray new];
            for (StringCheckModel * m in array) {
                if (m.start>= model.start&&m.end <= model.end) {
                    [dataRemove addObject:m];
                }
            }
            if (dataRemove.count != 0) {
                [array removeObjectsInArray:dataRemove];
            }
            
            [array addObject:model];
            if ([resultStr isEqualToString:changeStr]) {
                break;
            }
        }else{
            startIndex++;
        }
    }
    
    
    NSLog(@"----------------------------------去重复后相同字符串----------------------------------------------");
    
    NSMutableArray * dataResult = [NSMutableArray new];
    for (StringCheckModel * m in array) {
        NSLog(@"开始位置:%ld, 长度:%ld,结束位置:%ld,相同字符串:%@",m.start,m.lenth,m.end,m.str);
        StringCheckModel * model = [StringCheckModel new];
        if (array.firstObject == m && m.start!= 0) {
            model.start = 0;
            model.lenth = m.start;
            [dataResult addObject:model];
            if (array.lastObject != m) {
                NSInteger index = [array indexOfObject:m];
                StringCheckModel * nextModel = [array objectAtIndex:index+1];
                StringCheckModel * anotherModel = [StringCheckModel new];
                anotherModel.start = m.end;
                anotherModel.lenth = nextModel.start - m.end;
                [dataResult addObject:anotherModel];
            }
        }else if(array.lastObject == m){
            if (m.end != changeStr.length) {
                model.start = m.end;
                model.lenth = changeStr.length - model.start;
                [dataResult addObject:model];
            }
        }else{
            model.start = m.end;
            NSInteger index = [array indexOfObject:m];
            StringCheckModel * nextModel = [array objectAtIndex:index+1];
            model.lenth = nextModel.start - m.end;
            if (model.lenth>0) {
                [dataResult addObject:model];
            }
            
        }
        
    }
    
    NSLog(@"--------------------------------不同字符串------------------------------------------------");
    
    for (StringCheckModel * m in dataResult) {
        if (m.start + m.lenth > changeStr.length) {
            NSLog(@"👇数据超出范围");
        }else{
            [dataArrayGood addObject:m];
        }
        NSLog(@"开始位置:%ld, 长度:%ld,结束位置:%ld,不同字符串:%@",m.start,m.lenth,m.end,[changeStr substringWithRange:NSMakeRange(m.start, m.lenth)]);
    }
    
    return dataArrayGood;
}

@end


@implementation StringCheckModel

@end

相关文章

  • iOS比对字符串获取不同字符位置

    需求 在用户提交的修改内容需要标注出哪些字符是有变化的,然后标红显示 思路 从原始字符串的第0位开始扫描截取,分别...

  • 字符串操作

    字符串操作 1、.length:获取字符串长度 2、[index]:获取字符串某个指定位置的字符(不能赋值) 3、...

  • shell之字符串

    获取字符串长度:${#变量} 与 expr length 变量 获取字符串索引位置:expr index变量 获取...

  • oracle 字符串 用法

    字符串截取的函数: substr(要截取的字符串,开始位置,结束位置); 获取目标字符出现的位置: instr(要...

  • JS--字符串

    字符串常用操作 获取字符串长度 获取字符串某个指定位置的字符(使用下标访问) 字符串是不可变的,如果对字符串的某个...

  • js字符串与数组、json对象

    字符串String 通过下标获取字符 如下 通过字符获取字符所在位置 字母大小写转换 replace 替换字符串...

  • Shell-字符串

    相关属性 readonly 只读属性 unset 删除变量 位置变量 字符串拼接 获取字符串长度 字符串截取 字符...

  • String

    1、获取1.1 字符串中的包含的字符数,也就是字符串的长度。int length(): 获取长度。1.2 根据位置...

  • JAVA5:String的基本操作

    关于字符串的基本操作: 1.查找字符串的位置,查找字符串某位置的字符;2.获取子字符串,通过两种重载过的subst...

  • JS数据类型:1、字符串

    1、字符串 (1)属性:length:字符串长度; (2)方法: 1、charAt():获取指定位置的字符; va...

网友评论

    本文标题:iOS比对字符串获取不同字符位置

    本文链接:https://www.haomeiwen.com/subject/kesthhtx.html