Почему мой собственный компаратор выполняет только одно сравнение? - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь использовать настраиваемый компаратор для сортировки списка из двух или более известных строк. Я хочу, чтобы список содержал только строки до и после операции сортировки, поэтому я использовал перечисление для определения правильного порядка. Приведенное ниже работает в онлайн-консоли, как и ожидалось:

    ​class StringComparator implements Comparator<String> {
        enum validStrings {
        string_should_be_first,
        string_second,
        string3,
        string_four,
        string_five
        }

        @Override
        public int compare(String str1, String str2) {
            if (validStrings[str1].ordinal() == validStrings[str2].ordinal()){
                return 0
            }
            else{
                println("Comparing ${validStrings[str1].ordinal()} and ${validStrings[str2].ordinal()}")
                return (validStrings[str2].ordinal() < validStrings[str1].ordinal()) ? 1 : -1;
            }
       }
   }

    mylist = ["string_second", "string_five", "string3", "string_should_be_first"]​​​​​​​​​​​​​​​​​​​​​​​​​​
    println(mylist)
    Collections.sort(mylist, new StringComparator())
    println(mylist)​

Выводы (Правильно, и выводит много «сравнительных» операторов, как и ожидалось:

    [string_second, string_five, string3, string_should_be_first]
    Comparing 1 and 4
    Comparing 4 and 2
    Comparing 1 and 2
    Comparing 4 and 0
    Comparing 2 and 0
    Comparing 1 and 0
    [string_should_be_first, string_second, string3, string_five]

Когда я пытаюсь переместить его в Однако в IDE (код Visual Studio) мой собственный компаратор перестает работать. Я специально замечаю, что он выполняет только одно сравнение, прежде чем оставить исходный список без изменений:

StringComparator. groovy

    ​class StringComparator implements Comparator<String> {
        enum validStrings {
        string_should_be_first,
        string_second,
        string3,
        string_four,
        string_five
        }

        @Override
        public int compare(String str1, String str2) {
            if (validStrings[str1].ordinal() == validStrings[str2].ordinal()){
                return 0
            }
            else{
                println("Comparing ${validStrings[str1].ordinal()} and ${validStrings[str2].ordinal()}")
                return (validStrings[str2].ordinal() < validStrings[str1].ordinal()) ? 1 : -1;
            }
        }
    }

OtherClass. groovy

    import *.StringComparator
    ....
    mylist = ["string_four", "string_should_be_first", "string3", "string_second"]
    println("Initial: ${mylist}")
    Collections.sort(mylist)
    println("Default sort: ${mylist}")
    Collections.sort(mylist, new StringComparator())
    println("Custom sort: ${mylist}")

Выходы:

    Initial: [string_four, string_should_be_first, string3, string_second]
    Default sort: [string3, string_four, string_second, string_should_be_first]
    Comparing 2 and 4
    Custom sort: [string3, string_four, string_second, string_should_be_first]

Я не могу понять, почему мой собственный компаратор работает в онлайн-консоли, но не в IDE, или почему он пытается выполнить только одно сравнение, а затем оставить список без изменений - я был бы очень признателен за любую помощь или руководство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...