2013-05-11 33 views
1

所以我有排序ArrayList的問題。我需要在插入方法中使用,所以我正在編寫基於此的代碼。這是打算做的是用戶需要輸入4個3個字母的單詞,然後按字母順序在ArrayList中排序。我一直在嘗試不同的事情,但是當我運行代碼時,它將第一個單詞排序,但重複它。輸出真的取決於我所說的話。我覺得我的問題是在while循環中,但我一直在嘗試不同的方式,但我遇到了同樣的問題。任何幫助是極大的讚賞。排序遇到問題

import java.util.ArrayList; 
import TerminalIO.KeyboardReader; 

public class Insert{ 
    public static void main(String[] args) { 
     int i,j; 
     String tmp; 
     ArrayList<String> words = new ArrayList<String>(); 
     int run = 4; 
     KeyboardReader reader = new KeyboardReader(); 
     while(run!=0) { 
      words.add(reader.readLine("Enter a three letter word: ")); 
      run--; 
     } 


     for (j=1; j<words.size(); j++) { 
      i = j - 1; 
      tmp = words.get(j); 

      while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
       words.set(i,tmp); 
       words.set(i+1,words.get(i)); 
       i--; 
      } 

     //words.set(i+1,tmp); 

     } 

     for(int r = 0; r<words.size(); r++) 
      System.out.print(words.get(r) + " "); 

    } 
} 
+0

你有沒有實現自己的排序或剛需分類?如果你只是想嘗試Collections.sort(單詞)。按字母順序排序。 – arynaq 2013-05-11 22:08:44

+1

我認爲他是一名學生;學生應該至少手動做一次。 – 2013-05-11 22:09:29

+1

是的,我是一名學生,Collection.sort概念對我並不好,因爲我正在嘗試學習如何修改插入方法以對字符串進行排序。 – Johngianni 2013-05-11 22:18:25

回答

0

爲什麼不只是使用Collections.sort而不是自己排序。這應該是這樣的while循環後:

while(run!=0){ 
    words.add(reader.readLine("Enter a three letter word: ")); 
    run--; 
} 
Collections.sort(words); 
+0

這似乎是一個好主意,但我們需要了解插入方法的工作原理。有幾種方法,如插入方法和氣泡方法,我們需要專門使用插入方法。 – Johngianni 2013-05-11 22:15:22

1

你結束了重複的單詞原因是while塊:

while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
    words.set(i,tmp); 
    words.set(i+1,words.get(i)); 
    i--; 
} 

您的i個字設置爲tmp,然後你將第i+1個字設爲i-第0123個字,即tmp

恐怕你也有一些代碼組織問題了。首先,請嘗試實際創建一個Insert對象,然後調用它。讓你的方法更小;每種方法應該只做一件事。

+0

我可能在組織代碼時遇到問題。當你說我將i + 1單詞設置爲i單詞時,tmp是words.get(j),這使得它成爲不同的索引。我只是困惑於如何讓這個以正確的方式排序。 – Johngianni 2013-05-11 22:21:56

+0

當我運行代碼的部分不是它切換從j索引選擇一個索引後面的單詞,因爲我= j-1。在我這樣做之後,我把被比較的單詞放在j的後面,並且只要while循環正確就可以完成。 – Johngianni 2013-05-11 22:24:59

+0

我設法解決了這個問題。我刪除了words.set(i,tmp);從while循環和for循環中我留下的代碼評論我用words.set(i + 1,tmp)替換它,現在它工作。感謝您的支持。 – Johngianni 2013-05-11 22:32:00

0

如果你需要做這種特別的方式,你需要在第二次使用一個字符串變量while循環,我們稱之爲TMP2:

while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
    tmp2 = words.get(i); 
     words.set(i,tmp); 
     words.set(i+1,tmp2); 
     i--; 
    }