Давайте посмотрим на код, который вы написали:
String temp;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) < 0) {
words.set(i, temp);
words.set(i,j);
words.set(j, temp);
}
}
}
Хотя на самом деле это ничего не меняет. Давайте опишем этот внутренний l oop в терминах объяснения кода:
if words[i] is alphabetically "lower" than words[j], do:
- write the content of "temp" into words[i]
- write the number "j" into words[i]
- write the content of "temp" into words[j]
Здесь есть несколько проблем:
- вы, вероятно, хотите отменить это условие, потому что вы хотите (z, a) становиться (a, z), а не наоборот.
- вы никогда не будете присваивать значение
temp
, поэтому этот код фактически "испортит" ваш список со значениями null
, - у вас есть две строки, которые пишут в один и тот же индекс, поэтому первая
words.set(i, temp)
в основном «ничего не делает», даже если она и поступила правильно.
Давайте исправим что: замена двух элементов в любом массиве или списке требует третьего временного заполнителя. Вы помещаете один из двух элементов, которые хотите поменять, во временный заполнитель, затем перезаписываете этот элемент значением другого элемента, а затем перезаписываете элемент over значением временного заполнителя:
- начнем со списка (a, b), желания поменять местами элементы 0 и 1 и некоторого temp var
- set temp = list [0], так что теперь у нас есть
list=(a,b), temp=a
. - список перезаписи [0] со списком [1], поэтому теперь у нас есть
list=(b,b), temp=a
- список перезаписи [1] с вашим временным значением, поэтому теперь у нас есть
list=(b,a), temp=a
Вы используете переменную temp
и код ArrayList, так что это будет:
String temp;
for(...) {
for(...) {
if (...) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}