#java
Вопрос:
У меня есть вложенный цикл , который проходит через каждый элемент в списке, сравнивая его/сортируя, затем я пытаюсь возвести числа в квадрат в списке(имейте в виду, что их нужно отсортировать). Проблема в том, что когда я запускаю свою программу, список массивов «тест», который я использую, не печатает последний в квадрате, но дважды печатает предпоследний в квадрате. Например, если мой список массивов равен (1,2,3,4,5), мой код должен выводить (1,4,9,16,25), но вместо этого он выводит (1,4,9,16,16). Я, кажется, не могу понять, почему.
Мой код:
public static void sortSquares(Listlt;Integergt; tempList) { int result = 0; for (int i = 0; i lt; tempList.size(); i ) { for (int j = tempList.size() - 1; j gt; i; j--){ if (tempList.get(i) gt; tempList.get(j)) { result = tempList.get(j) * tempList.get(j); } else if (tempList.get(j) gt; tempList.get(i)) { result = (tempList.get(i) * tempList.get(i)); } } System.out.println(result); } }
Ответ №1:
Решение не будет работать, если tempList[i] == tempList[j]
заменить else if
на else
, и оно будет работать.
Комментарии:
1. Спасибо за помощь!, Еще один небольшой вопрос, если бы я хотел преобразовать вывод, чтобы он печатался следующим образом: [1,4,9,16,25] вместо создания новой строки, как бы я это сделал?
2. Вы можете сохранить строку и добавить к ней.
String s = "["
. ВместоSystem.out.println(result)
этого вы можете сделатьs = i == tempList.length - 1 ? result "]" : result ","
иSystem.out.print(s)
в конце. Вы можете оптимизировать его дальше, используяStringBuilder
класс для добавления в строку.
Ответ №2:
В последнем внешнем цикле, когда i = 4
внутренний цикл становится:
for (int j = 4; j gt; 4; j--)
который ничего не делает, и печатается внешний цикл result
, содержащий предыдущее значение (16).
Решением может быть замена условия для внутреннего цикла на j gt;= i
. Вам также необходимо заменить условие на if
, так как tempList.get(j)
теперь оно будет равно tempList.get(i)
:
for (int i = 0; i lt; tempList.size(); i ) { for (int j = tempList.size() - 1; j gt;= i; j--){ if (tempList.get(i) gt; tempList.get(j)) { result = tempList.get(j) * tempList.get(j); } else if (tempList.get(j) gt;= tempList.get(i)) { result = (tempList.get(i) * tempList.get(i)); } } System.out.println(result); }
Это будет работать для (1,2,3,4,5).
Тем не менее, того же результата можно было бы достичь с помощью более простого кода:
Collections.sort(tempList); /* Optional, if you want to sort the result */ Listlt;Integergt; result = new ArrayListlt;gt;(); for (int i = 0; i lt; tempList.size(); i ) { result.add(tempList.get(i) * tempList.get(i)); } System.out.println(result);
Комментарии:
1. Спасибо за помощь!, Еще один небольшой вопрос, если бы я хотел преобразовать вывод, чтобы он печатался следующим образом: [1,4,9,16,25] вместо создания новой строки, как бы я это сделал?
2. Я обновил пример. Вам просто нужно поместить весь результат в список массивов, и результат будет именно таким, как вы хотите.