2017-02-17 5 views
-2

Hier ist die Problemstellung: Schreiben Sie eine Funktion, die 2 Zeichenfolgen vergleicht, um wahr oder falsch zurückzugeben, abhängig davon, ob beide Zeichenfolgen die gleichen Buchstaben enthalten. Ordnung spielt keine Rolle.Java Anfänger, Vergleichen von Zeichenfolgen in verschachtelten für Schleife

Ich weiß nicht, wie man die Zeichenarrays in meiner verschachtelten for-Schleife richtig vergleicht. Ich wünschte, ich könnte genauer auf mein Problem eingehen, aber ich bin ein wirklich neuer Lerner und kann nicht verstehen, warum das nicht funktioniert. Ich glaube, es macht nicht, was ich in den verschachtelten for-Schleifen möchte. Danke im Voraus!

import java.util.Scanner; 

public class PracticeProblems { 

public static boolean stringCompare(String word1, String word2) { 
    char[] word1b = new char[word1.length()]; 
    char[] word2b = new char[word2.length()]; 
    boolean compareBool = false; 

    for(int i = 0; i < word1.length(); i++) { 
     word1b[i] = word1.charAt(i); 
     word2b[i] = word2.charAt(i); 
    } 

    for(int i = 0; i < word1.length(); i++) { 
     for(int j = 0; j < word2.length(); j++) { 
      if(word1b[i] == word2b[j]) { 
       compareBool = true; 
       break; 
      } else { 
       compareBool = false; 
       break; 
      } 
     } 
    } 
    return compareBool; 
} 

public static void main(String []args) { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Word 1?"); 
    String word1 = scan.nextLine(); 
    System.out.println("Word 2?"); 
    String word2 = scan.nextLine(); 

    if(PracticeProblems.stringCompare(word1, word2) == true) { 
     System.out.println("Same Letters!"); 
    } else { 
     System.out.println("Different Letters..."); 
    } 

} 
+1

Sie "brechen" immer beim ersten Mal durch die Schleife.Entfernen Sie die 'break' in' if' und belassen Sie die eine im 'else'. – resueman

+0

Warum nicht einfach 'char [] word1b = word1.toCharArray();'? (Oder vergleichen Sie 'word1.charAt (i)' und 'word2.charAt (j)', was das Erstellen neuer Arrays vermeidet). –

+0

Setzen Sie die Zeichen jeder 'Zeichenfolge' in ein' Set'. Dann vergleiche die Sets. –

Antwort

1

Der folgende Code wird den Job erledigen. Dies ist im Wesentlichen eine Erweiterung von Franks Kommentar oben. Wir konvertieren die zwei Strings in zwei Sätze und vergleichen sie dann.

import java.util.*; 

public class SameChars { 

    // Logic to convert the string to a set 
    public static Set<Character> stringToCharSet(String str) { 
     Set<Character> charSet = new HashSet<Character>(); 
     char arrayChar[] = str.toCharArray(); 
     for (char aChar : arrayChar) { 
      charSet.add(aChar); 
     } 

     return charSet; 
    } 

    // Compares the two sets 
    public static boolean hasSameChars(String str1, String str2) { 
     return stringToCharSet(str1).equals(stringToCharSet(str2)); 
    } 

    public static void main(String args[]){ 
     // Should return true 
     System.out.println(hasSameChars("hello", "olleh")); 
     // Should returns false 
     System.out.println(hasSameChars("hellox", "olleh")); 
    } 

} 
+0

Kannst du darüber nachdenken, wie du es ohne Set machen kannst? :) –

+2

Zuerst prüfen, ob Strings die gleiche Länge haben, wenn sie dann zwei Arrays aus den Strings erstellen, sortieren und dann die Indizes vergleichen. Der Rest ist Hausaufgabe :) –

+0

Hätte das nicht eine bessere Antwort gegeben? –

0

Erlauben Sie mir boolean Variable letterFound (oder vielleicht sogar letterFoundInWord2) zu umbenennen, weil das ist, was Sie in Ihrer Doppelschleife zu überprüfen. Erläuternde Benennungen erleichtern die Klarheit der Gedanken.

Da Sie einen Brief von word1 zu einer Zeit überprüfen, können Sie die Deklaration von letterFound innerhalb der äußeren for Schleife bewegen und es zu false hier initialisieren, da jedes Mal, wenn Sie einen neuen Brief nehmen von word1 Sie es nicht gefunden haben, in word2 noch nicht. In Ihrer if Anweisung innerhalb der for Schleifen ist es korrekt zu break in dem Fall, dass die Buchstaben gleich sind und Sie setzen letterFound auf True. Im gegenteiligen Fall, brechen Sie nicht, gehen Sie einfach weiter zum nächsten Buchstaben. In der Tat können Sie den else Teil vollständig löschen.

Nach der inneren for Schleife, wenn letterFound noch nicht true ist, wissen wir, dass der Brief von word1 ist nicht in word2. So sollte stringCompare() return false:

if (! letterFound) { 
    return false; 
} 

Mit dieser Änderung nach dem äußeren for Schleife wir wissen, dass alle Briefe von word1 in word2 gefunden wurden, so können Sie return true; hier eingeben.

Außer:

  • Sie scheinen die Saiten haben die gleiche Länge zu übernehmen. Wenn dies nicht der Fall ist, wird das Programm nicht korrekt funktionieren.
  • Wie Andy Turner sagte, sollten Sie auch überprüfen, dass alle Buchstaben in word2 sind in word1; Es folgt nicht aus den Buchstaben word1 in word2.
  • Sollten nur Buchstaben berücksichtigt werden? Sollten Sie Leerzeichen, Ziffern, Interpunktion, ... ignorieren?

Ich hoffe, Sie werden es herausfinden können. Fühlen Sie sich frei, in Kommentaren zu folgen oder eine neue Frage zu stellen.

1

Ich sortierte Arrays vor dem Vergleich.

//import statement for Arrays class 
    import java.util.Arrays; 
    import java.util.Scanner; 

    public class PracticeProblems { 

    public static boolean stringCompare(String word1, String word2) { 
     char[] word1b = new char[word1.length()]; 
     char[] word2b = new char[word2.length()]; 

     boolean compareBool = true; 

     for(int i = 0; i < word1.length(); i++) { 
      word1b[i] = word1.charAt(i); 
     } 
     //sort the new char array 
     Arrays.sort(word1b); 


     // added a second loop to for the second world 
     for(int i = 0; i < word2.length(); i++) { 
      word2b[i] = word2.charAt(i); 
     } 

     Arrays.sort(word2b); 

     for(int i = 0; i < word1.length(); i++) { 

      //removed second for loop. 
    //  for(int j = 0; j < word2.length(); j++) { 

      // if the two strings have different length, then they are different 
      if((word1.length()!=word2.length())){ 
       compareBool = false; 
       break; 

      } 
      //changed to not equal 
      if((word1b[i] != word2b[i])) { 
       compareBool = false; 
       break; 

      } 
      //removed else statment 
    //  else { 
    //    compareBool = false; 
    //    break; 
    // 
    //  } 
     } 
     return compareBool; 
    } 

    public static void main(String []args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Word 1?"); 
     String word1 = scan.nextLine(); 
     System.out.println("Word 2?"); 
     String word2 = scan.nextLine(); 

     if(PracticeProblems.stringCompare(word1, word2) == true) { 
      System.out.println("Same Letters!"); 
     } else { 
      System.out.println("Different Letters..."); 
     } 
     //resource leak. use close() method. 
     scan.close(); 
    } 
    } 
+0

Schöne Erklärung. Ich bin ein wenig im Zweifel, ob Ihre Version korrekt ist, wenn der Benutzer "Leichtigkeit" und "See" eingibt. Sie enthalten die gleichen Buchstaben, nämlich a, e und s, nur jeweils nicht gleich viele. Wenn es eine Schulaufgabe ist, kann es sein, dass jedes Ergebnis akzeptabel ist, wenn nur angegeben wird, was das Programm tut. –

Verwandte Themen