作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想突出显示两个字符串之间的文本差异。第一个字符串是正确的字符串,第二个是用户输入的字符串。它显示了两者之间的拼写和语法错误。下面的例子
我有一个解决方案可以检查每个单词,然后是每个字母,它在某种程度上确实有效,但并非在所有情况下都有效。有更好的方法吗?
另一个无法正常工作的例子。
“The”应该是完全红色的,在士兵中只有“i”和“s”应该是红色的。所有的“进”都应该是红色的。
func colorTextDiff(correctStr:String, answerText:String) -> NSAttributedString {
var hintTextIndex = 0
let attribute = NSMutableAttributedString.init(string: correctStr)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.black , range: NSRange.init(location: 0, length: correctStr.count))
attribute.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize:14.0), range: NSRange.init(location: 0, length: correctStr.count))
let correctWords = correctStr.split(separator: " ")
var answerWords = answerText.split(separator: " ")
var answerWordIndex = 0
//match on words, when a word doesnt match test the word's character
for correctWord in correctWords {
if answerWordIndex>=answerWords.count { break}
let answerWord = answerWords[answerWordIndex]
var wrongChar = 0, answerCharIndex = 0
print("words ", correctWord, " ", answerWord)
if correctWord.lowercased() != answerWord.lowercased() {
for c in correctWord {
if answerCharIndex>=answerWord.count {
let len = correctWord.count-answerCharIndex
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: NSRange.init(location: hintTextIndex, length: len))
hintTextIndex += len+1
break
}
let correctChar = String(c)
let answerChar = String(answerWord)[answerCharIndex..<answerCharIndex+1]
print("chars ", correctChar, " ", answerChar)
if correctChar.lowercased() != answerChar.lowercased() {
print("hint index: ", hintTextIndex)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: NSRange.init(location: hintTextIndex+1, length: 1))
wrongChar+=1
}
answerCharIndex+=1
hintTextIndex+=1
}
} else {
hintTextIndex += correctWord.count+1
}
if(wrongChar<correctWord.count) {answerWordIndex+=1 } //probably a missed word not missed typed word
}
hintTextIndex+=1
return attribute
}
最佳答案
这是一个很酷的问题。
这是我的解决方案:
extension NSMutableAttributedString {
func setCharacterColor(at location: Int) {
let range = NSRange(location: location, length: 1)
self.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: range)
}
}
extension Array where Element == Character {
func index(of character: Character, greaterThan index: Int) -> Int? {
for i in index...self.count where self[i] == character {
return i
}
return nil
}
}
let correctString = "The soldiers stormed into the village just after sunrise"
let incorrectString = "solder stormed village just after sunrise"
let correctArray = Array(correctString)
let incorrectArray = Array(incorrectString)
var correctMutableString = NSMutableAttributedString(string: correctString)
var currentPosition = 0
for char in incorrectArray {
guard let position = correctArray.index(of: char, greaterThan: currentPosition) else {
continue
}
while currentPosition < position {
correctMutableString.setCharacterColor(at: currentPosition)
currentPosition = currentPosition + 1
}
currentPosition = position + 1
}
labelCorrect.attributedText = correctMutableString
labelIncorrect.attributedText = NSMutableAttributedString(string: incorrectString)
它仍然是 n 平方阶,但这个问题的计算量总是很大。
它通过循环工作,直到它在正确的字符串中找到一个字符,该字符与不正确的字符串中的一个字符相匹配。然后它突出显示它在该过程中传递的所有字符。关键是它只突出显示新字符,而不是之前已经循环过的字符。
关于swift - 突出显示文本中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54526591/
有没有一种方法可以“标记”对象的属性,使它们在反射中“突出”? 例如: class A { int aa, b; string s1, s2; public int AA
我是一名优秀的程序员,十分优秀!