Строки сортировки выбором

Я читаю файл с городами и их населением и пытаюсь отсортировать города по алфавиту, используя сортировку выбором. Проблема в том, что по какой-то причине он сортирует его странным образом. Порядок «отсортированного» списка - «ABDCEFHG...». Я пытался следовать ему, но не могу понять, где он путается. Это код:

    //Selection
    for (int i = 0; i < cities.size() - 1; i++) 
    {
        int minPos = i;
        for (int j = i + 1; j < cities.size(); j++) 
        {
            if (cities.get(j).compareToIgnoreCase(cities.get(minPos)) < -1)
                minPos = j;
        }
        swap(cities, minPos, i);
    }
    System.out.print("\nSelection: ");
    for(int i = 0; i < cities.size(); i++)
        System.out.print(cities.get(i) +"|");

private static void swap(ArrayList <String> a, int i, int j) 
{
    String temp = a.get(i);
    a.set(i, a.get(j));
    a.set(j, temp);
}

Есть идеи, что случилось?

Спасибо


person A.J    schedule 02.03.2015    source источник
comment
Вы пробовали использовать ... < 0 вместо ... < -1?   -  person August    schedule 03.03.2015
comment
почему вы используете ‹-1? вы должны использовать ‹0   -  person thermite    schedule 03.03.2015
comment
Да, это было проблемой. Это был первый раз, когда я использовал сравнение строк, поэтому я новичок в этом. Благодарю вас!   -  person A.J    schedule 03.03.2015
comment
добро пожаловать. Я бы рекомендовал вам прочитать javadoc для методов compareTo, чтобы вы полностью поняли, что происходит.   -  person thermite    schedule 03.03.2015


Ответы (1)


Как уже упоминали другие, ваша проблема почти наверняка заключается в вашем ... < -1 сравнении, которое по сути бессмысленно в контексте компараторов. Как описано в Comparable, сравнения в Java обычно делается путем возврата

отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше указанного объекта.

String.compareToIgnoreCase() следует тому же правилу:

Returns:
    a negative integer, zero, or a positive integer as the specified
    String is greater than, equal to, or less than this String, ignoring
    case considerations.

Эти контракты намеренно ничего не говорят о том, какими могут быть эти отрицательные или положительные числа, поэтому реализации могут делать все, что проще всего. Многие реализации будут явно возвращать -1, 0 или 1, но другие, в том числе в String, используют вычитание в качестве ярлыка, возвращая разницу между сравниваемыми элементами, например. x.compareTo(y) делает return x-y. Если x и y совпадают, результатом будет 0, в противном случае возвращается отрицательное число, если x меньше, и положительное число, если x больше.

Короче говоря, вы всегда должны использовать 0 в качестве точки сравнения.

person dimo414    schedule 02.03.2015