Този код (1) спира да търси знак за премахване веднага щом открие първото срещане. Този код (2) проверява дали всеки знак от въведения низ се появява в думата, независимо от реда.
С долния цикъл (1) итерираш всеки знак в низа и за всеки знак влизаш в друг цикъл, който преминава през низа с резултати. Веднага след като намериш съвпадение за текущия символ, го премахваш и излизаш от вътрешния цикъл с break. Това означава, че премахваш първото срещане, което намериш, и след това спираш да търсиш други срещания.
for (int j = 0; j < sequence.length(); j++) {
for (int k = 0; k < result.length(); k++) {
if (sequence.charAt(j) == result.charAt(k)){
result.deleteCharAt(k);
break;
}
}
}
Ето как би трябвало да изглежда:
for (int j = 0; j < result.length(); j++) {
if (index < input.length() && input.charAt(index) == result.charAt(j)) {
index++;
result.deleteCharAt(j);
j--;
}
}
В новия цикъл проверяваме всеки знак от резултата, за да видим дали съвпада с текущия знак от входа:
index < input.length() && input.charAt(index) == result.charAt(j)
Ако това стане, увеличаваме индекса и изтриваме знака на текущата позиция в резултата.
След това:
result.deleteCharAt(j)
премахва знака от резултат при текущия индекс j. Това премахва съвпадащия знак и само първото срещане, тъй като излизаме от цикъла към следващия символ на въвеждане след всяко съвпадение.
j–;
Това противодейства на ефекта на j++ във for-цикъла, когато знак бъде премахнат. Когато премахнем знак, всички знаци отдясно се изместват наляво и без j–, следващият знак ще бъде пропуснат в следващата итерация.
По този начин редът на знаците се поддържа и всеки съответстващ знак се премахва, решавайки проблемите, присъстващи в оригиналния код.
С пърция цикъл (2) преминаваш през всеки знак в резултата и проверяваш дали съвпада с текущия знак във входния низ. Ако има съвпадение, го добавяш към последователността и преминаваш към следващия знак във входния низ. Това се случва независимо къде се появява съответстващият знак в резултата. И ако знаците във входния низ се появят в резултата, но в различен ред, то пак ще го считаш за съвпадение.
for (int j = 0; j < result.length(); j++) {
if (input.charAt(index) == result.charAt(j)){
sequence += String.valueOf(input.charAt(index++));
}
if (index > input.length() - 1){
break;
}
}
Или целия код: TitleSearch - Pastebin.com.
Много е полезно да се правят и такива търсения: telerik title search - Google Suche.