import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/* Задача по алгоритмам
Задача: Пользователь вводит с клавиатуры список слов (и чисел). Слова вывести в возрастающем порядке, числа - в убывающем.
Пример ввода:
Вишня
1
Боб
3
Яблоко
2
0
Арбуз
Пример вывода:
Арбуз
3
Боб
2
Вишня
1
0
Яблоко
*/
public class Solution
{
public static void main(String[] args) throws Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ArrayList<String> list = new ArrayList<String>();
while (true)
{
String s = reader.readLine();
if (s.isEmpty()) break;
list.add(s);
}
String[] array = list.toArray(new String[list.size()]);
sort(array);
for (String x : array)
{
System.out.println(x);
}
}
public static void sort(String[] array)
{
//напишите тут ваш код
ArrayList<String> words = new ArrayList<>();
ArrayList<Integer> numbers = new ArrayList<>();
ArrayList<Boolean> bools = new ArrayList<>();
for (String a : array)
{
if (isNumber(a))
{
bools.add(true);
numbers.add(Integer.parseInt(a));
}
else
{
bools.add(false);
words.add(a);
}
}
for (int i = 0; i < words.size() - 1; i++)
{
for (int j = 0; j < words.size() - i - 1; j++)
{
if (isGreaterThan(words.get(j + 1), words.get(j)))
{
String change = words.get(j + 1);
words.set(j + 1, words.get(j));
words.set(j, words.get(j + 1));
}
}
}
for (int i = 0; i < numbers.size() - 1; i++)
{
for (int j = 0; j < numbers.size() - i - 1; j++)
{
if (numbers.get(j) < numbers.get(j + 1))
{
int change = numbers.get(j);
numbers.set(j, numbers.get(j + 1));
numbers.set(j + 1, change);
}
}
}
for (int i = 0, ii = 0, check = 0; check < array.length; )
{
if (bools.get(i))
{
array[check] = String.valueOf(numbers.get(i));
i++;
check++;
}
if (!(bools.get(ii)))
{
array[check] = words.get(ii);
ii++;
check++;
}
}
}
//Метод для сравнения строк: 'а' больше чем 'b'
public static boolean isGreaterThan(String a, String b)
{
return a.compareTo(b) > 0;
}
//строка - это на самом деле число?
public static boolean isNumber(String s)
{
if (s.length() == 0) return false;
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++)
{
char c = chars[i];
if ((i != 0 && c == '-') //есть '-' внутри строки
|| (!Character.isDigit(c) && c != '-') ) // не цифра и не начинается с '-'
{
return false;
}
}
return true;
}
}
事实上,这就是任务。问题是,出于某种原因,即使输入空字符串,我也不停地打字。我在代码中没有发现问题,请帮忙)而且是的,不要写为什么我没有用现成的方法进行排序,它不承担任务。
你有错误的合并算法。
您正在检查
bools.get(i)
,即行中的索引。例如,如果bools.get(i)
containsfalse
,您将永远不会增加i
,并通过整个循环尝试从中读取值words
(并且可能小于原始容器的总长度array.length
)。您需要检查一般索引,在您的情况下它只是
i + ii
.另外,验证是
i < array.length - 1 && ii < array.length - 1
错误的。您需要i < numbers.length || ii < words.length
或i + ii < array.length
。(可能还有其他错误,trace。)