2016-05-06 16 views
0

Ich habe zwei Strings:Wie bekomme ich den Index der Unterschiede in String von Index zu Index?

String s1 = "D3516025204  StackOverflow is good."; 
String s2 = "D3516025204  StackOverflow Nice to see you."; 

Zuerst sowohl für Zeichen der Zeichenfolge vergleichen und die Indizes oder Spalte keine drucken. wenn die Charaktere verschieden sind. Ich muss die Leerzeichen in die Zeichenfolge einschließen.

Wie in oben string:

Differenz der Indizes von s1 und s2: 34 bis 48

Ich versuchte unter:

 char[] first = text1.toLowerCase().toCharArray(); 

     char[] second = text2.toLowerCase().toCharArray(); 

     int minimum = Math.min(first.length, second.length); 

     StringBuffer buffer = new StringBuffer(); 

     for (int i = 0; i < minimum; i++) { 

      if (first[i] != second[i]) { 
       do{ 
       //System.out.print(first[i]+" "+second[i]); 
       System.out.println(text1.offsetByCodePoints(first[i],text1.indexOf(second[i]))); 

      }while(first[i] == second[i]); 
     } 

     } 
+0

Zuerst sehe ich eine Endlosschleife mit Ihrem do {} while. Du erhöhst nie i in dieser Schleife. Zweitens, warum hast du ein wenn nichts getan? Schließlich, was ist genau die Bedingung für den Unterschied, ist es immer s1 im Vergleich zu s2? – AxelH

+0

Ich muss beide Zeichenfolgen vergleichen, d. H. S1 im Vergleich zu s2. Wenn es einen Unterschied in der Zeichenkette gibt, dann hole die Indizes, d.h. von Index zu Index. – rockersdeal

Antwort

0
String text1 = "D8516025209  StackOverflow is good."; 
    String text2 = "D3516025204  StackOverflow Nice to see you."; 

    int minimum = Math.min(text1.length(), text2.length()); 
    int maximum = Math.max(text1.length(), text2.length()); 

    StringBuilder stringBuilder = new StringBuilder("Difference of indices from s1 and s2: "); 
    StringBuilder text1Diff = new StringBuilder(); 
    StringBuilder text2Diff = new StringBuilder(); 
    int index = 0; 

    while (index < minimum) 
    { 
     if (text1.charAt(index) != text2.charAt(index)) 
     { 
      stringBuilder.append(stringBuilder.length() > 0 ? ", " : "").append(index + 1).append(" - "); 
      text1Diff.append(text1Diff.length() > 0 ? ", " : ""); 
      text2Diff.append(text2Diff.length() > 0 ? ", " : ""); 

      while ((index < minimum) && (text1.charAt(index) != text2.charAt(index))) 
      { 
       text1Diff.append(text1.charAt(index)); 
       text2Diff.append(text2.charAt(index)); 
       index++; 
      } 

      if (index == minimum) 
      { 
       stringBuilder.append(maximum); 
       index = maximum; 

       if (maximum == text1.length()) 
        text1Diff.append(text1.substring(minimum)); 
       else 
        text2Diff.append(text2.substring(minimum)); 
      } 
      else 
       stringBuilder.append(index); 
     } 
     index++; 
    } 

    if (minimum != maximum && index < maximum) 
    { 
     stringBuilder.append(stringBuilder.length() > 0 ? ", " : "").append(minimum + 1).append(" - ").append(maximum); 

     if (maximum == text1.length()) 
      text1Diff.append(text1.substring(minimum)); 
     else 
      text2Diff.append(text2.substring(minimum)); 
    } 

    System.out.println(stringBuilder.toString()); 
    System.out.println("Differences: "); 
    System.out.println(text1Diff.toString()); 
    System.out.println(text2Diff.toString()); 
+0

das funktioniert irgendwie für mich, aber leider kam ich zu einer Situation, dass ich zwei Dateien zu vergleichen, die mehrere Datensätze um 50K in beiden Dateien hat. Nun können die sourceLine und targetLine anders sein, aber sourceLine kann in der nächsten Zeile oder in einer anderen Zeile verfügbar sein. Das heißt, wir können die zwei Linien Zeile für Zeile nicht unterscheiden. Aber Ihre Lösung ist gut genug, wenn die beiden Zeilen die gleiche Datenmenge haben, aber mit kleinen Änderungen. Also +1 für dich. – rockersdeal

+0

Ich möchte die Zeichenkette der Zeichen auch mit Differenz erhalten. Ich denke, ich sollte String.valueOf (char) verwenden; Bitte aktualisieren. – rockersdeal

+0

Welche Zeichen möchten Sie? von Text1 oder Text 2? oder beides? – aviad

0

dies versuchen.

String s1 = "D3516025204  StackOverflow is good."; 
    String s2 = "D3516025204  StackOverflow Nice to see you."; 

    if(s1.length() > s2.length()){ 
     for(int i=0; i< s1.length() - s2.length(); i++) 
      s2+=" "; 
    }else{ 
     for(int i=0; i< s2.length() - s1.length(); i++) 
      s1+=" "; 
    } 
    char[] c1 = s1.toCharArray(); 
    char[] c2 = s2.toCharArray(); 

    System.out.print("Difference is: "); 
    for(int i=0; i<c1.length; i++){ 
     if(c1[i]!=c2[i]){ 
      System.out.print(i+", "); 
     } 
    } 
+0

Warum haben Sie den harten Code-Wert in Teilstring genommen, kann es dynamische Werte sein. Bcoz Ich habe mehrere Strings zum Vergleichen verschiedener Längen. Selbst wenn der Index nicht gedruckt wird, werden nur Werte gedruckt. – rockersdeal

+0

Ich denke, es ist nicht sehr schwer, in irgendwelche Eingabedaten zu ändern. aber lass mich meine Antwort bearbeiten –

+0

Das bringt mich in Endlosschleife. Nicht funktioniert – rockersdeal

0
class CrazySolution { 
public static void main(String[] args) throws Exception { 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String line = br.readLine(); 
    String line1 = br.readLine(); 
    //process() 
    int lenofLine = line.length(); 
    int lenofLine1 = line1.length(); 
    int finalLen = Math.min(lenofLine, lenofLine1); 

    for (int i = 0; i < finalLen; i++) { 
     if (line.charAt(i) != line1.charAt(i)) 
      { 
      System.out.println(i); 
     break; 
     } 
    } 
    System.out.println(lenofLine == lenofLine1 ? -1 : finalLen); 

} 

}

die Sie interessieren ..

0

Werfen Sie einen Blick auf apache.commons.lang3.StringUtils oder dieses post

mit StringUtils.difference (String zuerst, String 2.) Ihr Code könnte so aussehen:

public static void main(String[] args) { 
    String s1 = "D3516025204  StackOverflow is good."; 
    String s2 = "D3516025204  StackOverflow Nice to see you."; 
    String s = StringUtils.difference(s1, s2); 
    int at = StringUtils.indexOfDifference(s1, s2); 
    System.out.println(at + "-" + s2.length()); 
    System.out.println(s); 
} 
+0

Danke +1 für die Verwendung der Apache Commons-Bibliothek. Aber löst mein Problem nicht. – rockersdeal

Verwandte Themen