RadixSort从文件中读取字符串并按ArrayList的降序排序

时间:2017-10-11 03:41:45

标签: java sorting radix-sort

我正在开发一个利用RadixSort读取单词的程序 使用我教授给我的算法从文件中按升序排序(要求RadixSort按预期工作,所有条目必须是单词,所有单词的长度必须相同)。我写了我的RadixSort类:

编辑:请忽略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. 我的输出看起来像这样:
  2.   

    未排序列表:   null家庭船员xray原子纱山羊谷仓风筝爱雨肥皂

    显然null不是我的一个词;但其他人都是正确的。我已经尝试更改我的toString并使用不同的输入文件进行测试,但我无法弄清楚为什么会发生这种情况。

    1. 程序不会更进一步,因为我在这一行得到一个EmptyCollectionException(正如它所说,队列是空的):
    2.   

      lowercaseArray.get(项目++)等于(arrayQueues.get(k)的.dequeue());

      但我无法弄清楚原因;当我向我的教授展示我的代码时,她表示逻辑是正确的,所以我希望我们都忽略了一些东西。

      另外,我不知道如何让我的代码按降序打印。

      我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

使用set()更新lowercaseArrayequals用于测试相等性。您使用while循环重新填充lowercaseArray时也会出现错误。应该检查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,该字段最初为空。您应该将其设置为局部变量并将其初始化为空字符串:

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