2016-07-14 4 views
-3

In Java suche ich nach einer Liste aller Anfangs- und Endindizes der Unterschiede zwischen zwei Zeichenfolgen. Ich sehe, wie ich den Anfangsindex des ersten Unterschieds zwischen zwei Saiten bekommen kann, aber ich kann nicht recht herausfinden, wie man dieses Problem beendet.Wie bekomme ich Anfangs-/End-Indizes aller Unterschiede zwischen zwei Zeichenfolgen in Java?

Ich habe Code in StringUtils gefunden: indexOfDifference (String, String), die den Startindex des ersten Unterschieds zwischen zwei Strings erhält, aber ich sehe keinen Weg, den Endindex dieses ersten Unterschieds zu bekommen, oder ich Sehen Sie einen Weg, um alle übrigen Start-/Endindizes aller Unterschiede zwischen den beiden Strings zu erhalten.

Zum Beispiel, wenn ich diese beiden Strings: origStr: "Hallo Welt" revisedStr: "Help the World23"

Ich möchte alle Bereiche der Unterschiede zwischen orig und überarbeitet strs.

Jede Anleitung wäre sehr hilfreich.

Dies ist der Code, den ich bisher habe:

import difflib.*; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.net.URL; 
import java.util.LinkedList; 
import java.util.List; 

public class TestDiffUtils { 

    public TestDiffUtils() { 

    } 

    // Helper method to read the files to compare into memory, convert them to a list of Strings which can be used by the DiffUtils library for comparison 
    private static List fileToLines(String filename) { 
     List lines = new LinkedList(); 
     String line; 
     try { 
      URL path = TestDiffUtils.class.getResource(filename); 
      File f = new File(path.getFile()); 
      BufferedReader in = new BufferedReader(new FileReader(f)); 
      while ((line = in.readLine()) != null) { 
       lines.add(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return lines; 
    } 

    private static void printUnifiedDiffs(List<String> diffs){ 
     for(String diff : diffs){ 
      System.out.println(diff); 
     } 
    } 

    /** 
    * Compares two Strings, and returns the index at which the 
    * Strings begin to differ. 
    * 
    * For example, 
    * <code>indexOfDifference("i am a machine", "i am a robot") -> 7</code> 
    * 
    * <pre> 
    * StringUtils.indexOfDifference(null, null) = -1 
    * StringUtils.indexOfDifference("", "") = -1 
    * StringUtils.indexOfDifference("", "abc") = 0 
    * StringUtils.indexOfDifference("abc", "") = 0 
    * StringUtils.indexOfDifference("abc", "abc") = -1 
    * StringUtils.indexOfDifference("ab", "abxyz") = 2 
    * StringUtils.indexOfDifference("abcde", "abxyz") = 2 
    * StringUtils.indexOfDifference("abcde", "xyz") = 0 
    * </pre> 
    * 
    * @param str1 the first String, may be null 
    * @param str2 the second String, may be null 
    * @return the index where str2 and str1 begin to differ; -1 if they are equal 
    * @since 2.0 
    */ 
    public static int startingIndexOfDifference(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; 
    } 

    private static void doBasicLineByLineDiff(Boolean doLargeFileTest) { 
     String origFileName; 
     String revisedFileName; 

     if(doLargeFileTest) 
     { 
      origFileName = "test_large_file.xml"; 
      revisedFileName = "test_large_file_revised.xml"; 
     }else{ 
      origFileName = "originalFile.txt"; 
      revisedFileName = "revisedFile.txt"; 
     } 

     List<String> originalLines = fileToLines(origFileName); 
     List<String> revisedLines = fileToLines(revisedFileName); 

     Patch patch = DiffUtils.diff(originalLines, revisedLines); 
     List<String> diffs = DiffUtils.generateUnifiedDiff(origFileName, revisedFileName, originalLines, patch, 0);  // 0 = don't show any lines of context around different lines 
     List<Delta> deltas = patch.getDeltas(); 
     for(Delta delta : deltas){ 
      int diffLine = delta.getOriginal().getPosition()+1; 
      System.out.println("[" + diffLine + " : (" + startingIndexOfDifference((String) delta.getOriginal().getLines().get(0), (String) delta.getRevised().getLines().get(0)) + ",<todo-diffEndIndexHere>)]"); 
     } 

     // printUnifiedDiffs(diffs); 
    } 

    public static void main(String[] args) { 
     doBasicLineByLineDiff(false); 
    } 
} 
+0

[Was haben Sie versucht, das funktioniert nicht] (http://whathaveyoutried.com)? – ManoDestra

+1

Bearbeitet, um Code zu zeigen, habe ich bis jetzt. Ich kann den Startindex des ersten Diff bekommen, aber ich brauche die Bereiche der Indizes für alle Diffs zwischen zwei Strings. –

+0

Ich fühle mich wie du das rekursiv tun könntest. – jordaniac89

Antwort

1

DiffUtils.diff() nimmt List<?>, und Sie nennen es mit Linien (List<String>) zu finden Linie Unterschiede.

Sie können es wiederverwenden, um Zeichenunterschiede zwischen zwei Zeilen zu finden, d. H. List<Character>.

Es hat bereits die ganze Komplexität der Identifizierung, wo ein Unterschied endet, und die Gemeinsamkeit beginnt wieder, wiederholt. Versuchen Sie nicht, das selbst zu implementieren, wenn Sie bereits eine Bibliothek haben, die das kann.

+0

Vielen Dank. Ich vermisste dieses kleine Detail wegen einiger der Namen in der DiffUtils-Klasse. Andreas hat darauf hingewiesen und manchmal ist die einfachste Lösung die beste Lösung. –

Verwandte Themen