Задача: Пользователь вводит с клавиатуры список слов (и чисел).
Слова вывести в возрастающем порядке, числа - в убывающем.
Пример ввода (каждый элемент с новой строки):
Вишня, 1, Боб, 3, Яблоко, 22, 0, Арбуз
Пример вывода(каждый элемент с новой строки):
Арбуз, 22, Боб, 3, Вишня, 1, 0,Яблоко
1й подход - и внутренний цикл тоже перебирает весь массив (работает) :
public static void sort(String[] array) {
for (int i = 0; i < array.length; i++) { // весь цикл
String temp = "";
if (isNumber(array[i])) { // если элемент это число,
for (int k = 0; k < array.length; k++) {
if (isNumber(array[k])) { // то сравнить со следующими числами
и переставить по необходимости, и такая же операция со словами
2й подход - внутр. цикл пытается найти следующего кандидата того же типа.
это работает для слов, но выходит за массив для чисел...где-то, как-то ))
public static void sort(String[] array) {
String temp=""; boolean foundNextWord=false; boolean foundNextNum=false;
for (int j=array.length-1; j>0; j--) { // сортировка пузырьком внешний цикл
for (int i = 0; i < j; i++) { // сортировка пузырьком внутренний цикл
if (!isNumber(array[i])) { // если элемент это слово, то
int k = i + 1; // начиная со след. элемента
// ищем следующий элемент слово
while (true) {
if (!isNumber(array[k])) { foundNextWord = true; break; }
if (k == array.length) { break; }
k++;
}
if (foundNextWord) {
if (isGreaterThan(array[i], array[k])) { // сравниваем и переставляем
temp = array[i]; array[i] = array[k]; array[k] = temp; foundNextWord = false;
}
}
} else if (isNumber(array[i])) { // если элемент это число, то
int n = i + 1; // начиная со след. элемента
while (true) { // ищем следующий элемент число
if (isNumber(array[n])) { //здесь получаем ArrayIndexOutOfBoundsException
foundNextNum = true; break; } //но не понятно почему: в сортирке слов Exception_а нет
if (n == array.length) {break; }
n++; // и т.к. j=array.length-1; и i < j - не ясно как n = i+1; - выходит за массив
}
if (foundNextNum) {
if(Integer.parseInt(array[i]) > Integer.parseInt(array[n])) { //сравниваем и переставляем
temp = array[i]; array[i] = array[n]; array[n] = temp; foundNextNum = false;
}
} } } } }
спасибо, что дочитали до конца ))
UPD1:
благодаря подсказке в комментарии, стало понятно, что ставить проверку нужно было не на
if (n == array.length) break; а на
if (n == array.length-1) break;
но код всё равно ведёт себя непредсказуемо: вместо
ArrayIndexOutOfBoundsException теперь натыкаемся на
Exception in thread "main" java.lang.NumberFormatException: For input string: "Яблоко"
и всё так же не ясно почему
UPD2:
уже практически даже ясно почему ))