Я пишу свой собственный метод сортировки Radix для сортировки слов в строке (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()
- и поэтому пытается создать подстроку с использованием String Indexes, которые больше длины строки.
Как настроить мой метод так, чтобы он создавал подстроки каждого слова до letterNumber == word.length()
, а также мог бы применять алгоритм сортировки для этих более коротких слов - «a» стал бы до «aa».
Кажется, у вас есть ** пустое слово ** в списке. Это может произойти, если вы разделяете символы, отличные от слов, и они находятся в начале или конце, или один не учитывает, что между словами может быть несколько символов, отличных от слова. –