2017-10-11 62 views
0

我正在研究一個程序,該程序利用RadixSort從文件中讀取文字 並使用教授給我的算法以升序排序(要求對於此RadixSort按預期工作,所有條目必須是單詞,並且所有單詞必須具有相同的長度)。我寫了我的RadixSort類:RadixSort從文件中讀取字符串並從ArrayList中降序排列

編輯:請忽略initializeWords方法中的註釋。他們在那裏進行測試。

public class RadixSort implements RadixSortADT{ 

private ArrayList<String> lowercaseArray; 
private ArrayList<LinkedQueue<String>> arrayQueues; 
private String results; 


public RadixSort(){ 

} 

public RadixSort(ArrayList<String> w) { 
    lowercaseArray = new ArrayList<String>(); 
    arrayQueues = new ArrayList<>(); 
    initializeList(); 
    initializeWords(w); 
} 

public void initializeList() { 
    for(int i = 0; i < 26; i++){ 
      arrayQueues.add(new LinkedQueue<String>()); 
    } 
} 

public void initializeWords(ArrayList<String> w) { 
    // Get size of first word and check length and if it is a character. 
    // Test all 26 letters of the alphabet. 
    for(int i = 0; i < w.size(); i++){ 
     lowercaseArray.add(w.get(i).toLowerCase()); 
    } 
} 

public void sort() { 
    int item = 0; 
    for(int i = lowercaseArray.get(0).length()-1; i>=0; i--){ 
     for(int j = 0; j < lowercaseArray.size(); j++){ 
      char character = lowercaseArray.get(j).charAt(i); 
      arrayQueues.get(character-97).enqueue(lowercaseArray.get(j)); 
     } 
     item = 0; 
     for(int k = 0; k < arrayQueues.size(); k++){ 
      while(!arrayQueues.isEmpty()){ 
       lowercaseArray.get(item++).equals(arrayQueues.get(k).dequeue()); 
      } 
     } 
    } 

} 

public String toString(){ 

    for(String words: lowercaseArray){ 
     results += " " + words + " "; 
    } 
    return results; 
} 

} 

,併爲進一步參考,肇事司機也被我的教授提供的,看起來是這樣的:

public class RadixSortDriver { 

public static void main(String[] args) throws FileNotFoundException{ 
    int i = 0; 
    ArrayList<String> words = new ArrayList<>(); 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Enter the name of the file to import words"); 
    String filename = scan.nextLine(); 
    //String filename = "four.txt"; 
    Scanner inFile = new Scanner(new File(filename)); 
    while(inFile.hasNext()) { 
     words.add(inFile.nextLine()); 
    } 
    RadixSort r = new RadixSort(words); 
    System.out.println("Unsorted List:\n" + r); 
    r.sort(); 
    System.out.println("\n\nSorted List:\n" + r); 
} 

} 

但我發現了兩個錯誤:

  1. 我的輸出看起來是像這樣:

Uns orted列表: null主隊Xray原子紗山羊穀倉風箏愛雨肥皂

顯然null不是我的一個單詞;但其他人都是正確的。我試着改變我的toString並使用不同的輸入文件進行測試,但我無法弄清楚爲什麼會發生這種情況。

  • 該程序就不再進一步介紹,因爲我得到一個EmptyCollectionException(因爲它說,該隊列是空的)在這一行:
  • lowercaseArray.get (項++)等於(arrayQueues.get(k)的.dequeue());

    但我找不出原因;當我向我的教授展示我的代碼時,她表示邏輯是正確的,所以我希望我們都忽略了一些東西。

    此外,我不知道如何讓我的代碼以降序打印。

    我真的很感謝一些幫助。

    +0

    1.因爲您的'toString'附加到空字段'results'。使它成爲一個局部變量並將其初始化爲空字符串:'String results =「」;' – teppic

    回答

    1

    使用set()更新您的lowercaseArrayequals用於測試是否相等。在用於重新填充lowercaseArraywhile循環中也存在錯誤。它應該檢查arrayQueues.get(k).isEmpty()

    固定碼:

    item = 0; 
    for (int k = 0; k < arrayQueues.size(); k++) { 
        while (!arrayQueues.get(k).isEmpty()) { 
         lowercaseArray.set(item++, arrayQueues.get(k).dequeue()); 
        } 
    } 
    

    你與你的toString方法遇到的問題是,它的追加到外地results,這是最初爲null。您應該將其設置爲局部變量並將其初始化爲空字符串:

    public String toString() { 
        String results = ""; 
        for (String words : lowercaseArray) { 
         results += " " + words + " "; 
        } 
        return results; 
    } 
    
    +0

    因爲它是LinkedQueues的ArrayList,所以lowercaseArray.set(item ++,arrayQueues.get(k).dequeue)能夠工作嗎? –

    +0

    對不起,我對'java.util.Queue'接口進行了測試(我不確定你的'LinkedQueue'是什麼樣的;我認爲這是你課程的工作)。在'java.util.Queue'中,'remove'方法刪除並返回隊列的頭部。我已經更新了使用'dequeue'調用的答案。 – teppic