2013-08-20 3 views
14

Ciao ho due stringhe:Estrarre la differenza tra due stringhe in 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"; 

voglio ottenere ciò che non è presente nella stringa di sentire che è "Hey There \ n". Ho trovato un metodo, ma non riesce per questo caso:

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 ""; 
    } 
} 

Qualcuno può aiutare?

+1

Penso che un altro approccio possa essere suddiviso Stringa basata sullo spazio e quindi loop su ogni elemento? – kosa

+0

Sì Nambari, grazie. Questo è quello che ho fatto . –

risposta

7

Uno può utilizzare il StringUtils da Apache Commons. Ecco lo 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

Si dovrebbe usare StringUtils da Apache Commons

+0

Sì, ne ho sentito parlare molto. –

2

convertire la stringa in liste e quindi utilizzare il seguente metodo per ottenere il risultato How to remove common values from two array list

+0

Ho diviso una delle stringhe e iterato sull'array e ho trovato il non comune nella seconda stringa. –

22

google-diff-match-patch

Il Diff Match e librerie di Patch offrire algoritmi robusti per eseguire le operazioni richieste per la sincronizzazione del testo normale.

Diff:

Confrontare due blocchi di testo normale e tornare in modo efficiente un elenco di differenze.

Partita:

Data una stringa di ricerca, trovare la sua migliore corrispondenza sfocata in un blocco di testo in chiaro. Ponderato sia per precisione che per posizione.

Patch:

Applicare un elenco delle patch sul testo normale. Usa il miglior sforzo per applicare la patch anche quando il testo sottostante non corrisponde.

Attualmente disponibile in Java, JavaScript, Dart, C++, C#, Objective C, Lua e Python. Indipendentemente dal linguaggio, ogni libreria presenta la stessa API e la stessa funzionalità. Tutte le versioni hanno anche cablaggi di prova completi.

C'è una pagina wiki Line or word diffs che descrive come fare le differenze linea per linea.

+0

Grazie Mike. :-) –

+2

Che fantastica lib. Grazie. – sebnukem

-1

E a proposito di questo snippet?

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 ha pubblicato la soluzione corretta. Questo fa un vero diff. 'String.contains()' fallirebbe se il contenuto del testo corrispondente avesse le sue linee riorganizzate. –

2

Ho usato il StringTokenizer per trovare la soluzione. Di seguito è riportato il frammento di codice

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

utilizzando l'oggetto di linguaggio Java principale anziché la dipendenza di terze parti rende il codice meno complicato! – bakoyaro

0

ero alla ricerca di qualche soluzione, ma non sono riuscito a trovare quello di cui avevo bisogno, così ho creato una classe di utilità per il confronto di due versioni del testo - vecchi e nuovi - e ottenere il testo risultato con cambiamenti tra i tag - [aggiunto] e [cancellato]. Potrebbe essere facilmente sostituito con l'evidenziatore scelto al posto di questo tag, ad esempio: un tag html. string-version-comparison

Eventuali commenti saranno apprezzati.

* potrebbe non funzionare bene con il testo lungo a causa della maggiore probabilità di trovare le stesse frasi cancellate.