2013-08-20 3 views
14

Привет У меня есть две строки:Extract разницу между двумя строками в Java

String hear = "Hi My name is Deepak" 
      + "\n" 
      + "How are you ?" 
      + "\n" 
      + "\n" 
      + "How is everyone"; 
    String dear = "Hi My name is Deepak" 
      + "\n" 
      + "How are you ?" 
      + "\n" 
      + "Hey there \n" 
      + "How is everyone"; 

Я хочу, чтобы получить то, чего нет в строке слышна, что является «Эй Там \ п». Я нашел метод, но он не подходит для этого случая:

static String strDiffChop(String s1, String s2) { 
    if (s1.length() > s2.length()) { 
     return s1.substring(s2.length() - 1); 
    } else if (s2.length() > s1.length()) { 
     return s2.substring(s1.length() - 1); 
    } else { 
     return ""; 
    } 
} 

Может ли кто-нибудь помочь?

+1

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

+0

Да, Намбари, спасибо. Это то, что я сделал. –

ответ

7

Можно использовать StringUtils от Apache Commons. Вот StringUtils API.

public static String difference(String str1, String str2) { 
    if (str1 == null) { 
     return str2; 
    } 
    if (str2 == null) { 
     return str1; 
    } 
    int at = indexOfDifference(str1, str2); 
    if (at == -1) { 
     return EMPTY; 
    } 
return str2.substring(at); 
} 
public static int indexOfDifference(String str1, String str2) { 
    if (str1 == str2) { 
     return -1; 
    } 
    if (str1 == null || str2 == null) { 
     return 0; 
    } 
    int i; 
    for (i = 0; i < str1.length() && i < str2.length(); ++i) { 
     if (str1.charAt(i) != str2.charAt(i)) { 
      break; 
     } 
    } 
    if (i < str2.length() || i < str1.length()) { 
     return i; 
    } 
    return -1; 
} 
1

Вы должны использовать StringUtils из Apache Commons

+0

Да, я слышал об этом много. –

2

преобразовать строку в списке, а затем использовать следующий метод, чтобы получить результат How to remove common values from two array list

+0

Я разделил одну из строк и повторил по массиву и нашел необычную во второй строке. –

22

google-diff-match-patch

The Diff Match и библиотеки Patch предлагает надежные алгоритмы для выполнения операций, необходимых для синхронизации обычного текста.

Diff:

Сравнение двух блоков обычного текста и эффективно возвращать список различий.

Match:

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

Patch:

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

В настоящее время доступно на Java, JavaScript, Dart, C++, C#, Objective C, Lua и Python. Независимо от языка, каждая библиотека имеет тот же API и те же функции. Все версии также имеют комплектные испытательные жгуты.

Существует страница wiki-страницы Line or word diffs, которая описывает, как делать линейные различия.

+0

Спасибо, Майк. :-) –

+2

Какая удивительная библиотека. Благодарю. – sebnukem

-1

Что относительно этого фрагмента?

public static void strDiff(String hear, String dear){ 
    String[] hr = dear.split("\n"); 
    for (String h : hr) { 
     if (!hear.contains(h)) { 
      System.err.println(h); 
     } 
    } 
} 
+0

@MikeSamuel отправил правильное решение. Это правда. 'String.contains()' будет терпеть неудачу, если текстовое содержимое будет сопоставлено с перегруппировкой строк. –

2

Я использовал StringTokenizer, чтобы найти решение. Ниже приведен фрагмент код

public static List<String> findNotMatching(String sourceStr, String anotherStr){ 
    StringTokenizer at = new StringTokenizer(sourceStr, " "); 
    StringTokenizer bt = null; 
    int i = 0, token_count = 0; 
    String token = null; 
    boolean flag = false; 
    List<String> missingWords = new ArrayList<String>(); 
    while (at.hasMoreTokens()) { 
     token = at.nextToken(); 
     bt = new StringTokenizer(anotherStr, " "); 
     token_count = bt.countTokens(); 
     while (i < token_count) { 
      String s = bt.nextToken(); 
      if (token.equals(s)) { 
       flag = true; 
       break; 
      } else { 
       flag = false; 
      } 
      i++; 
     } 
     i = 0; 
     if (flag == false) 
      missingWords.add(token); 
    } 
    return missingWords; 
} 
+0

с использованием основного языка Java-объекта вместо сторонней зависимости делает для менее сложного кода! – bakoyaro

0

Я искал какое-то решение, но не могу найти тот, я нужен, поэтому я создал вспомогательный класс для сравнения две версии текста - новой и старой - и получить результат текст с изменения между тегами - [добавлено] и [удалены]. Его можно легко заменить ярлыком, который вы выбираете вместо этих тегов, например: тег html. string-version-comparison

Любые комментарии будут оценены.

* Возможно, это не сработало с длинным текстом из-за большей вероятности нахождения тех же самых фраз, которые были удалены.

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