2013-06-26 23 views
0

所以我在Java初學者從一本書解決其中的問題是:Lexological字符串排序查詢

寫一個程序,設置了包含您所選擇的一段文字 一個字符串變量。從文本中提取單詞並按照字母順序將它們排序 。顯示排序的單詞列表。你可以用 使用一種簡單的排序方法,稱爲冒泡排序。按照升序排列數組 ,過程如下:a。從 開始,數組中的第一個元素,比較連續元素(0和1,1 和2,2和3等等)。灣如果任何一對的第一個元素大於第二個元素,則交換這兩個元素。 C。重複整個陣列的 過程,直到不需要交換。 數組元素現在按升序排列。

爲了這我的解決辦法是:

public class bubbleSort { 

    public static void main(String[] args) { 

     String Homer = "He was the son of Epikaste and Telemachus. " + 
       "He was said to be a court singer "; 

     String swap; 
     Homer = Homer.replace(',', ' '); 
     Homer = Homer.replace('.', ' '); 
     Homer = Homer.replace(" ", " "); 

     String[] words = Homer.split(" "); 

     for(String val:words){ 
      System.out.println(val); 
     } 

     System.out.println(" ---- SORTED -------"); 

     boolean exchange = true; 
     while (exchange) { 
      exchange = false; 
      for (int i = 0; i < (words.length - 1); ++i) { 
       if (words[i].charAt(0) > words[i + 1].charAt(0)) { 

        swap = words[i]; 
        words[i] = words[i + 1]; 
        words[i + 1] = swap; 
        exchange = true; 
       } 
      } 
     } 

     for(String val:words){ 
      System.out.println(val); 
     } 
    } 
} 

然而有序輸出並未如預期!

他Epikaste和特勒馬庫斯的兒子,他被說成是法院 歌手---- SORETED ------- Epikaste他他特勒馬庫斯和兒子的可以在法庭 說歌手到當時是

我在哪裏犯了一個錯誤?謝謝 !

+2

你的輸出首先顯示了開頭大寫字母,然後以小寫的那些話。不看你的代碼我想你忘了大寫和小寫字母的不同代碼:) – sotix

+1

也類名應該以大寫字母開頭 – sotix

+0

@sotix謝謝你的擡頭! –

回答

2

簡單的方法是將所有單詞轉換爲大寫或小寫。

然而,比較用Java語言的單詞的正確方法是使用Collator

Collator myCollator = Collator.getInstance(); // optional: pass your locale 
if(myCollator.compare("abc", "ABC") < 0) 
    System.out.println("abc is less than ABC"); 
else 
    System.out.println("abc is greater than or equal to ABC"); 

這可以確保有特殊字符,如「E」或「A」被正確排序的話。雖然這對你的例子沒有任何影響,但如果你正在學習Java,那就從頭開始學習。


在您的例子,在方法的開頭創建一個整理機實例,並更換

if (words[i].charAt(0) > words[i + 1].charAt(0)) 

if (myCollator.compare(words[i], words[i+1]) > 0) 
+0

有沒有辦法在不改變大小寫的情況下對信件進行排序? –

+0

*此*是在不更改箱子的情況下對單詞進行排序的方式 – Cephalopod

+0

謝謝!不熟悉Collat​​or課程使我成爲前一個問題。 –

2

它的排序大寫字母小於ASCII以獲得正確的排序改變所有的資金爲小寫或反之亦然小寫字母排序時

+0

謝謝@Kevin有沒有辦法在不更改大小寫的情況下對信件進行排序? –

0

我猜你不喜歡的結果是它在小寫字詞之前排列大寫字母(大寫)。這並不奇怪,因爲大寫字符A-Z使用代碼點65至90,而小寫字符a-z具有代碼點97至122.因此,大小寫字符在比較中總是比小寫字符「小」。

解決方案:將所有單詞轉換爲小寫以進行比較。爲此,使用String.toLowerCase()

例如,而不是原來的代碼

for (int i = 0; i < (words.length - 1); ++i) { 
    if (words[i].charAt(0) > words[i + 1].charAt(0)) { 

做到這一點更像

for (int i = 0; i < (words.length - 1); ++i) { 
    String w = words[i].toLowerCase(); 
    String w1 = words[i+1].toLowerCase(); 
    if (w.charAt(0) > w1.charAt(0)) { 
+0

有沒有辦法在不改變大小寫的情況下對信件進行排序? –

+0

排序字母?以爲你在分類*詞*? ;-)無論如何,這不會改變你的話的情況下,它只會使小寫的副本。 (字符串在Java中是不可變的,你不能改變它們,你只能派生出來。)排序仍然發生在你​​的原始數據中。 –