私は自分の基数ソート方法を使って文字列内の単語をソートしています(the big black cat sat on the beautiful brown mat
はbeautiful big black brown cat mat on sat the the
としてソートされます)。このメソッドは、個々の単語のList(私自身のListインターフェイス)を取り込み、その場所のリストを並べ替えます。String Radix Sort - StringIndexOutOfBoundsEception
public static void stringRadixSort(List<String> list, int letters) {
List<String>[] buckets = (List<String>[]) Array.newInstance(List.class, 26);
int letterNumber = 1; //Sorts list by 1st letter of each word, then 2nd etc.
for (int i = 0; i < letters; i++) {
while (!list.isEmpty()) {
String word = list.remove(list.first());
if (word.length() > letters) throw new UnsortableException("The list contains a word that holds more letters than the given maximum number of letters."
+ "\nMax Letters: " + letters + "\nWord: " + word);
String letter = word.substring(letterNumber - 1, letterNumber); //EXCEPTION THROWN
char ch = letter.charAt(0);
int index = ch - 'a'; //gets index of each letter ('a' = buckets[0], 'z' = buckets[25]
if (buckets[index] == null) {
buckets[index] = new LinkedList<String>();
}
buckets[index].insertLast(word);
}
for (int j = 0; j < buckets.length; j++) {
if (buckets[j] != null) {
while (!buckets[j].isEmpty()) {
list.insertLast(buckets[j].remove(buckets[j].first()));
}
}
}
letterNumber++;
}
}
私の方法では(唯一、私は願っています)問題は、私は単語の各文字を読んでいたとき、私は言葉の単一文字の部分文字列を作成することである。ここでは
は、これまでのところ、私の方法であり、 。 for
のループがletters
回(ここでletters
はリスト内の単語の最大長です)まで実行されるため、このループが現在の単語の長さよりも大きい反復になると例外がスローされます。つまり、letterNumber > word.length()
です。文字列の長さよりも大きい文字列インデックスを使用して部分文字列を作成しようとしています。
letterNumber == word.length()
まで各単語の部分文字列を作成し、これらの短い単語にソートアルゴリズムを適用できるようにメソッドを調整するにはどうすればよいですか? "a"は "aa"の前になります。
リストに**空の単語**があるようです。これは、単語以外の文字を分割して開始または終了した場合、または考慮しなかった場合に、複数の単語以外の文字が単語間にある可能性があります。 –