iOS比对字符串获取不同字符位置
2020-02-27 本文已影响0人
整个夏天
需求
在用户提交的修改内容需要标注出哪些字符是有变化的,然后标红显示
思路
从原始字符串的第0
位开始扫描截取,分别对比修改后的字符串的相同位置,找出相同字符串位置,然后再反转位置得出不同字符串位置
例子
原始字符串:good
修改后字符串:goods
- 从
0
开始,长度为1
,等到g
字符串,对比修改后字符串的相同位置 - 字符相同,则再从
0
开始,长度为2
,得到字符串go
,依次类推得到的相同字符串位置为location:0,lenth:4
,字符串为good
- 以相同字符串的坐标为基础推算出不同字符串的位置即可
代码
//
// 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