2014-11-28 2 views
4

Я пытаюсь определить, отличается ли введенное слово одним символом в текстовом файле. У меня есть код, который работает, но, к сожалению, только для слов с двумя символами или меньше, что явно не очень полезно, и сам код выглядит немного беспорядочным. Вот то, что я до сих пор:Поиск, если String отличается на один символ

if(random.length() == word.length()){ 
    for(int i = 0; i < random.length(); i++){ 
    if((word.charAt(i) == random.charAt(i))){ 
     str += word+"\n"; 
     count++; 
    } 
    } 
} 

С random быть слово, которое было введено пользователем, и word быть слово для поиска в текстовом файле.

Если я изменил свое второе if заявление что-то вдоль линий

if((word.charAt(i) == random.charAt(i)) && (word.charAt(i -1) == random.charAt(i-1))) 

и если я изменю int i быть = 1 вместо этого, я, кажется, чтобы получить больше того, что я ищу, чтобы достигнуть, но то мой код ищет только в том случае, если первые две буквы совпадают, а не в том случае, если и последние два, что и должно делать.

+0

Так что же вы спрашиваете? – csmckelvey

+0

Учитывая слово пользователя, в данном случае 'random', я пытаюсь найти текстовый файл с большим количеством слов и посмотреть, отличается ли какое-либо из слов в этом текстовом файле только одним символом' random '. Например; день похож на слова: скажем, луч, плотина, даб и т. д. – user180708

+0

Что вы подразумеваете под «одним измененным персонажем»? Одно удаление, одна вставка или только одно редактирование? – marc

ответ

6

Предполагаю, что вам нужна такая функция? Я только что написал и протестировал его.

static boolean equals(String word1, String word2, int mistakesAllowed) { 
    if(word1.equals(word2)) // if word1 equals word2, we can always return true 
     return true; 

    if(word1.length() == word2.length()) { // if word1 is as long as word 2 
     for(int i = 0; i < word1.length(); i++) { // go from first to last character index the words 
      if(word1.charAt(i) != word2.charAt(i)) { // if this character from word 1 does not equal the character from word 2 
       mistakesAllowed--; // reduce one mistake allowed 
       if(mistakesAllowed < 0) { // and if you have more mistakes than allowed 
        return false; // return false 
       } 
      } 
     } 
    } 

    return true; 
} 
+0

Я пытался включить ваш пример в соответствии с моим, но, к сожалению, я не могу заставить его работать. Что такое 'int mistakesAllowed'? – user180708

+0

это число разных символов, которые разрешены между word1 и word2, поэтому в вашем случае это должно быть 1. Я немного отредактирую код, чтобы вы поняли. – luuksen

+0

Хорошо, спасибо, вот что я подумал. Я думаю, что моя проблема в том, что ваш пример возвращает логическое значение, и поскольку я использую текстовый файл, мне нужно написать inputFile.close() после каждого оператора true/false, и поэтому этот метод возвращает мое слово как false, а не печать. – user180708

0

Ваш код, кажется, работает со мной, вы можете просто неправильно интерпретировать его результаты.

Это может быть более очевидным:

int count = 0;  if(random.length() == word.length()) { 
for(int i = 0; i < random.length(); i++) 
{ 
    if((word.charAt(i) != random.charAt(i))) 
    { 
     if(count == 0) 
     { 
      System.out.println("Found first difference!"); 
     } 
     if(count != 0) 
     { 
      System.out.println("Strings are more than one letter different!"); 
     } 
     count++; 
    } 
} } 

Если вы хотите, чтобы проверить строк разной длины, вам необходимо удалить символы из более длинного, пока это не тот же размер, тем короче. Например: Если String1 = "abc"; и String2 = "zzzabcdef";

Вам нужно будет удалить 6 символов из второй строки и протестировать каждую комбинацию из 6 символов. Таким образом, вы захотите проверить строки: def, cde, abc, zab, zza, zzz, zzb, zzc, zzd, zze, zzf, zaf, zae, zad, zac, zab, zza, zzf, zze, ... , ..., в том числе и в списке, размер 9 выбирается 6, поэтому он определенно не оптимален или не рекомендуется.

Вы можете, однако, проверить, является ли строка, которая является одним символом длиннее другой, является другой строкой с одной добавленной буквой. Для этого вам нужен цикл for, чтобы захватить две подстроки от 0 до i и от i + 1 до конца. Это не учитывает i-й символ, а цикл для размера строки - 1 даст вам сначала полную строку, затем строку без первой буквы, затем пропустят вторую букву и т. Д. Затем проверьте эту подстроку таким же образом, как и мы.

Комментарий, если это не то, что вы ищете.

EDIT

Чтобы увидеть, как много слов в файле, одна буква отличается от переменной слова, вам нужно перебрать файл, получая каждое слово. Тогда тестирование, если это была строка, состояло из одной буквы. Было бы что-то вроде этого:

String testAgainst = "lookingForWordsOneLetterDifferentThanThisString"; 
 
int words = 0; 
 

 
Scanner scan = new Scanner(fileName); 
 

 
while(scan.hasNext()) 
 
{ 
 
    String word = scan.next(); 
 
\t 
 
    if(isOneDifferent(word, testAgainst)) 
 
    { 
 
     words++; 
 
    } 
 

 
    System.out.println("Number of words one letter different: " + words); 
 
} 
 

 
public boolean isOneDifferent(String word, String testAgainst) 
 
{ 
 
    if(word.length() != testAgainst.length()) 
 
    { 
 
     return false; 
 
    } 
 

 
    int diffs = 0; 
 

 
    for(int i = 0; i < word.length(); i++) 
 
    { 
 
     if(word.charAt(i) != testAgainst.charAt(i)) 
 
     { 
 
      diffs++; 
 
     } 
 
\t \t 
 
     if(diffs > 1) 
 
     { 
 
      return false; 
 
     } 
 
    } 
 

 
    if(diffs == 1) 
 
    { 
 
     return true; 
 
    } 
 
    else 
 
    { 
 
     return false; 
 
    } 
 

 
}

+1

Спасибо, не могли бы вы объяснить, почему счетчик будет равен 0? Я использовал счетчик, чтобы определить, сколько слов различалось только одной буквой, поэтому, если 'count == 0', и вы печатаете то, что обнаружили первое различие, для меня это не имеет смысла. – user180708

+0

О, я вижу, я думал, вы используете его, чтобы увидеть, сколько писем было по-другому. Я изменю свой код, чтобы представить, что вы хотите. –

Смежные вопросы