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