2013-03-20 69 views
0

下面是我寫的用於放置彼此相鄰的所有字謎,字符串集合中的代碼。 輸出未按預期排序。實際上,輸出與輸入相同。 我哪裏錯了?比較沒有給出預期的結果

package set2; 

import java.util.Arrays; 
import java.util.Comparator; 

public class printAllAnagrams { 
    public static void main(String[] args) { 
     String[] s = { "Harsha", "ant", "sha", "tna", "ash" }; 
     sortAnagrams(s); 
     for (String e : s) { 
      System.out.println(e); 
     } 
    } 

    private static void sortAnagrams(String[] s) { 
     Arrays.sort(s, new Comparator<String>() { 

      @Override 
      public int compare(String s1, String s2) { 
       s1.toLowerCase(); 
       s2.toLowerCase(); 

       if (s1.length() != s2.length()) { 
        return -1; 
       } else { 
        char[] s1_char = s1.toCharArray(); 
        char[] s2_char = s2.toCharArray(); 
        Arrays.sort(s1_char); 
        Arrays.sort(s2_char); 

        for (int i = 0; i < s1_char.length; i++) { 
         if (s1_char[i] != s2_char[i]) { 
          return -1; 
         } 
        } 
       } 
       return 0; 
      } 

     }); 

    } 
} 
+0

調試您的代碼以驗證您的期望。 – Kai 2013-03-20 15:39:54

回答

0

這不能肯定是正確的:

if (s1.length() != s2.length()) { 
    return -1; 
} 

這將意味着,如果s1.length() != s2.length()s1 < s2s2 < s1

我認爲你是什麼意思做的是:

public int compare(String s1, String s2) { 
    if (s1.length() == s2.length()) {     
     char[] s1_char = s1.toLowerCase().toCharArray(); 
     char[] s2_char = s2.toLowerCase().toCharArray(); 
     Arrays.sort(s1_char); 
     Arrays.sort(s2_char); 

     for (int i = 0; i < s1_char.length; i++) { 
      if (s1_char[i] != s2_char[i]) { 
       return (int)(s1_char[i] - s2_char[i]); 
      } 
     } 
     return 0; 
    } else { 
     return s1.length() - s2.length(); 
    } 
} 
+0

@downvoter如果我運行這個代碼,它會給出「sha ash ant tna Harsha」......這似乎正是所要求的...... – 2013-03-20 15:55:15

0

沒有看太密切,這

s1.toLowerCase(); 

不會改變s1而是返回一個字符串,它是s1小寫變型。 Java中的字符串是不可改變。所以你需要收集和處理從上面返回的值。

0

你爲什麼不只是做到以下幾點:

 @Override 
     public int compare(String s1, String s2) { 
      return s1.toLowerCase().compareTo(s2.toLowerCase()); 
     } 
+0

這不能解決OP問題。他尋找anagrams。 – 2013-03-20 15:52:53

0

你比較不穩定的。

首先你return -1如果長度是不同的。這意味着根據操作數順序,您可能會發現「asbd」>「ash」或相反。

你也做的比較炭相同。

if (s1_char[i] != s2_char[i]) { 
    return -1; 
} 

替代這與:

if (s1_char[i] != s2_char[i]) { 
    return s1_char[i] > s2_char[i] ? 1 : -1; 
} 

使用用於長度相比相同的模式。

編輯返回-1從compare方法,意味着你找到的第一個操作數小於第二個按照該documentation

0

字符串是不可改變的所以只是調用String對象的方法不改變String本身。你應該使用下列內容:

s1 = s1.toLowerCase(); 
s2 = s2.toLowerCase(); 
0

javadoc

實現程序必須確保sgn(compare(x,y)) == -sgn(compare(y,x))所有xy。 (這意味着,當且僅當compare(y,x)拋出一個異常compare(x,y)必須拋出異常。)。

這基本上意味着,如果你叫compare(s1,s2)它產生-1 * compare(s2,s1)既不你return -1;報表遵循這一點。取而代之的是,你可以比較整數和人物,彼此返回值,例如此代碼的工作(而不是return -1;):

return Integer.compare(s1.length(),s2.length()); //for the ints 

return Character.compare(s1_char[i],s2_char[i]); //for the chars 

而且看看維沙爾的回答,這是另一個錯誤。