2017-02-17 1 views
-2

다음은 문제 문입니다. 두 문자열이 같은 문자를 포함하는지에 따라 true 또는 false를 반환하는 2 문자열을 비교하는 함수를 작성하십시오. 명령은 중요하지 않습니다.Java 초급, 중첩 for 루프의 문자열 비교

내 중첩 for 루프의 문자 배열을 올바르게 비교하는 방법을 모르겠습니다. 문제가 무엇인지 좀 더 구체적으로 알고 싶지만 실제로 새로운 학습자이며 이것이 작동하지 않는 이유를 알 수 없습니다. 나는 중첩 된 for 루프에서 원하는 것을하지 않는다고 생각한다. 미리 감사드립니다!

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

항상 루프를 통해 처음에는 '중단'됩니다.'if'에서'break'를 제거하고'else'에서 남겨 둡니다. – resueman

+0

왜'char [] word1b = word1.toCharArray();'가 아닌가? (또는'word1.charAt (i)'와'word2.charAt (j)'를 비교하면 새로운 배열 생성을 피할 수 있습니다). –

+0

각'String '의 문자를'Set'에 넣습니다. 그런 다음 세트를 비교하십시오. –

답변

1

아래 코드는 작업을 수행합니다. 이것은 본질적으로 위의 Frank의 의견을 확장 한 것입니다. 우리는 두 문자열을 두 세트로 변환 한 다음 비교합니다.

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

세트를 사용하지 않고 어떻게 할 수 있습니까? :) –

+2

먼저 문자열이 동일한 길이인지 확인한 다음 문자열에서 두 개의 배열을 만들고 정렬 한 다음 색인을 비교합니다. 나머지는 숙제입니다. –

+0

더 좋은 대답을하지 않았습니까? –

0

하면이 당신이 당신의 더블 루프에서 확인 무엇 때문에 나를 (또는 어쩌면 letterFoundInWord2) letterFoundboolean 변수의 이름을 변경하도록 허용합니다. 설명 이름을 사용하면 생각을 쉽게 지울 수 있습니다.

한 번에 word1에서 하나 개의 문자를 확인하고 있기 때문에

, 당신은 외부 for 루프 내에서 letterFound의 선언을 이동하고 word1에서 새 편지를 취할 때마다 당신이 그것을 발견되지 않았기 때문에 여기 false로 초기화 할 수 있습니다 word2에 있습니다. for 루프 내의 if 문에서 글자가 같고 letterFound을 true로 설정 한 경우에는 break으로 수정하십시오. 반대의 경우, 끊지 말고 그냥 다음 문자를 확인하십시오. 실제로 else 부분을 완전히 삭제할 수 있습니다. 아직도 true입니다 letterFound 경우 내부 for 루프 후

, 우리는 word1에서 편지가 word2에없는 것을 알고있다. 그래서 stringCompare()는 false를 반환해야합니다

if (! letterFound) { 
    return false; 
} 

을이 변경으로 외부 for 루프 후에 우리는 word1에서 모든 문자가 word2에서 발견이었다 알고 있으므로 여기에 return true;을 입력 할 수 있습니다. 제외

:

  • 당신은 문자열이 동일한 길이를 가정 할 것으로 보인다. 그렇지 않은 경우 프로그램이 올바르게 작동하지 않습니다.
  • Andy Turner가 말한 것처럼 word2의 모든 문자가 word1에 있는지 확인해야합니다. word1의 글자는 word2에 있습니다.
  • 글자 만 고려해야합니까? 공백, 숫자, 구두점을 무시해야합니까? ...?

희망을 찾을 수 있습니다. 후속 조치를 취하여 의견을 나누거나 새로운 질문을하십시오.

1

비교 전에 배열을 정렬했습니다.

//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

좋은 설명. 나는 사용자가'ease'와'seas'를 입력하면 버전이 맞는지 의심 스럽다. 그것들은 똑같은 글자, 즉 a, e와 s를 포함하며, 각각 똑같이 많은 수의 글자를 가지고 있지 않습니다. 학교 과제물 인 경우 프로그램의 기능 만 지정하면 결과가 허용 될 수 있습니다. –