2012-12-04 33 views
1

這裏是我的代碼。但它不起作用。請幫助我瞭解我的問題在哪裏。這對我來說非常複雜。我的代碼必須找到我的2個輸入是否是anagram。 (例如:安靜,聽)控制字謎詞

import java.util.Scanner ; 
    import java.lang.String ; 
    public class Anagram { 

public static void main(String[] args) { 
    Scanner scanner = new Scanner (System.in) ; 

    System.out.println("Enter your firs word: "); 
    String s1= scanner.nextLine() ; 
    System.out.println("Enter your second word: "); 
    String s2 = scanner.nextLine() ; 

    if(isAnagram(s1,s2)){ 

     System.out.println("Your words are anagram") ; 

    } 
} 

public static boolean isAnagram(String s1, String s2) { 

    int a = s1.length() ; 
    int b= s2.length() ; 
    if (a==b){ 
     int count=0; 
     int i,j ; 
     char x, y ; 
     for (i=0, j=0; i<=a; i++){ 

     x = s1.charAt(i) ; 

     y = s2.charAt(j); 

     j++; 
     if (x==y){ 
      count++ ; 
     while (count==a){ 
      return true; 
     } 
        return false; 
     } 
    } 
    } 

}  

}

+1

你是否必須使用這個算法,或者你打開一個完全不同的算法? – RonaldBarzell

+1

我拿了你的代碼,它不能編譯 - 你需要修正你的返回語句isAnagram方法 – Katana24

+0

你的意思是:[nag a ram](https://www.google.com/search?q=anagram) ? – BrOSs

回答

1

我會propably嘗試排序的字符串,然後檢查他們是否有在相同的位置相同的字母。這裏將與java.util.Arrays中的一個簡單的解決方案:

public static boolean isAnagram(String s1, String s2) { 
    char[] string1 = s1.toCharArray(); 
    char[] string2 = s2.toCharArray(); 
    Arrays.sort(string1); 
    Arrays.sort(string2); 
    return Arrays.equals(string1, string2); 
} 
+0

+1是的,很好的解決方案。 – dreamcrash

+0

不,這是我的作業,我不能使用數組。 – bendensin

+0

是的,我必須使用這個算法 – bendensin

-2

你可能需要在同時在方法聲明一個布爾類型isAnagram並將其設置爲true或false,例如

boolean isAnagram; 

// Do other stuff 
     while (count == a) 
     { 
     isAnagram = true; 
     } 
     isAnagram = false; 
     } 
     } 
    } 
    return isAnagram; 
} 

否則你會得到編譯錯誤

+0

-1:OP的代碼確實有編譯錯誤,但這不是解決方案,也不是必需的。 –

+0

好吧,我想我詳細說明一下評論 – Katana24

3

既然你不能使用陣列,一種方法可以是:

public boolean isAnagram(String a, String b) { 

    if(a.length() != b.length()) return false; 

    for (int i=0; i < a.length(); i++) { 
     for (int j=0; j <b.length(); j++) { 

      if (a.charAt(i) == b.charAt(j)) 
      { 

       a = removeCharAt(a,i); 
       b = removeCharAt(b,j); 
       i=0; 
       j=0; 
      } 
     } 
    } 
    return a.equals(b); 
} 

其中removeCharAt是:

public static String removeCharAt(String s, int pos) { 
    return s.substring(0,pos)+s.substring(pos+1); 

} 

第一測試是驗證兩個字符串是否具有相同的大小。如果他們有,那麼你首先從第一個字符串中取一個字符,然後檢查這個字符是否存在於第二個字符串中。 如果存在,則從兩個字符串中刪除此字符。並從第一個字符串中取出另一個字符並重復該過程,直到不再有字符進行比較。最後如果最終結果字符串等於他們的字謎。

你應該刪除這兩個字符串的字符串,以避免像字符串a =「AAAAA」和字符串b =「Abbbb」這樣的例子給它一個字謎。由於字符串'a'的每個字符將匹配字符串'b'的第一個位置。

在代碼中的一些問題:

public static boolean isAnagram(String s1, String s2) { 

    int a = s1.length() ; 
    int b= s2.length() ; 

if (a==b){ 
    int count=0; 
    int i,j ; 
    char x, y ; 
    for (i=0, j=0; i<=a; i++){ 

    x = s1.charAt(i) ; 

    y = s2.charAt(j); 

    j++; 
    if (x==y){ 
     count++ ; 
    while (count==a){ 
     return true; 
    } 
       return false; 
    } 
} 
} 

}

您將有超出範圍的錯誤,因爲i<=a內並a = s1.length(),不必返回在if (a!=b)的情況下,任何東西。除此之外,你通過比較同一位置上的每個字符是否相等來比較兩個字符串。這種方法對搜索一個字謎沒有用,它可能用來搜索兩個字符串是否相等。