Проблемы с сортировкой выбором

У меня проблема со следующим кодом, когда я пытаюсь ввести список слов (альфа, дельта, Чарли, бета) и отсортировать их; однако список сначала сортирует все заглавные буквы, а затем строчные, например (альфа, Чарли, бета, дельта), хотя я просто хочу, чтобы он сортировался в алфавитном порядке в целом, т.е. -> (Альфа, бета, Чарли, дельта)

Пожалуйста, найдите мой код для сортировки выбора, прикрепленный ниже:

public void sortPokemon()
    {
    Pokemon temp;
    for(int i = 1; i < amount; i++){
        for(int j = i; j > 0; j--){
            if(pokemon[j].getSpecies().compareTo(pokemon[j-1].getSpecies()) < 0){
                    temp = pokemon[j];
                    pokemon[j] = pokemon[j-1];
                    pokemon[j-1] = temp;
                }
            }
        }
    }   

person Jake B.    schedule 12.12.2016    source источник
comment
Обычный String.compareTo работает только таким образом. Что вам нужно, так это собственный компаратор.   -  person Gurwinder Singh    schedule 12.12.2016


Ответы (4)


Вы можете либо реализовать Компаратор, там вы сравниваете строки с игнорированием регистра, что-то вроде:

public class IgnoreCaseComparator implements Comparator<String> {
    public int compare(String s1, String s2) {
         return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
}

Или вы можете поместить свои строки на карту (возможно, TreeMap), ключ — строчная (или заглавная) строка, значение — ваша исходная строка.

Обратите внимание, что способ карты не позволяет использовать одни и те же ключи.

person Kent    schedule 12.12.2016
comment

String.compareTo также соблюдает случай. Вы можете заставить Pokemon реализовать Comparable примерно так:

public class Pokemon implements Comparable<Pokemon> {
    // you other methods here

    @Override
    public int compareTo(Pokemon p) {
        return this.getSpecies().toLowercase().compareTo(p.getSpecies().toLowercase());
    }
}

Затем вы можете сделать прямое сравнение следующим образом:

if(pokemon[j].compareTo(pokemon[j-1])) 

Вы также можете использовать собственный компаратор.

person Gurwinder Singh    schedule 12.12.2016

Вы можете попробовать приведенный ниже код (отредактируйте свой if statement). Используйте метод compareToIgnoreCase(), определенный в классе String.java. Этот метод присутствует начиная с java 1.2.

if(pokemon[j].getSpecies().compareToIgnoreCase(pokemon[j-1].getSpecies()) < 0)

Обратите внимание, что при использовании метода compareTo() и преобразовании регистра строк в верхний или нижний регистр в цикле станет плохой производительность со строками. Но то же самое будет и при использовании других способов, которые делают ваш класс Pokemon реализующим интерфейс Comparable и возвращают соответствующее значение из метода compareTo. То же самое будет и с компаратором, расширяющим класс.

person nits.kk    schedule 12.12.2016

Поскольку все ваши входные данные имеют строковый тип данных, вы можете легко отсортировать их, используя встроенные методы для игнорирования регистра, присутствующие в библиотеке Java.

person Cms    schedule 12.12.2016