Переупорядочите два значения из списка в алфавитном порядке. Перечисление/Сравнение

закодированный список значений A, B, C, D, E, F, G.... Я хочу, чтобы D помещался перед C при повторении списка в JSP.

Я открыт для перечисления или для использования компараторов.

В настоящее время перечисление SortOrder отличается от объекта Comparable, который у меня есть.

Итак, как я могу справиться с этим кодом ниже.

//override

    public int compareTo(Alphabets) {

        return name.toLowerCase().compareTo(o.getName().toLowerCase());
      }

я пытался

private SortOrder so
     public void setName(String name) {
        this.name = so.values().toString();
      }

Но он выдает «Значения статического метода () из типа SortOrder должны быть доступны статически»

Помогите мне, пожалуйста.

Я попробовал stackoverflow и нашел это, что близко, но недостаточно: Сортировка Java о константах Enum

Редактировать: извините, что всех запутал, вопрос выше - это просто представление о моей проблеме. Слова, которые у меня есть для A, B, C,... имеют другое представление в моем коде. У меня есть список торговых марок для продукта, где я хочу изменить порядок списка.


person raja777m    schedule 20.08.2014    source источник
comment
Я думаю, нам понадобится немного больше вашего кода (по крайней мере, класса SortOrder), чтобы понять выброшенное исключение. Кроме того, можете ли вы уточнить ожидаемое правило сортировки? отсортировать значения в алфавитном порядке без учета регистра по возрастанию, за исключением случаев, когда есть числовой суффикс, иметь суффикс в порядке убывания ?   -  person Volune    schedule 21.08.2014
comment
Является ли D2 единственным случаем, или любая буква-число должна быть отсортирована таким особым образом?   -  person Bohemian♦    schedule 21.08.2014
comment
Редактировать: извините, что всех запутал, вопрос выше - это просто представление о моей проблеме. Слова, которые у меня есть для A, B, C,... имеют другое представление в моем коде. У меня есть список торговых марок для продукта, где я хочу изменить порядок списка. @Volune Спасибо   -  person raja777m    schedule 22.08.2014


Ответы (2)


Я все еще не совсем уверен, что понимаю ваш вопрос, но если я это сделаю, вот два решения:

С перечислением

Наименьшее решение, ограниченное возможными именами для значений перечисления. демонстрация

enum SortOrderEnum {
    A, B, D, C, E, F;
}

Сортировать по

Collections.sort(testData, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return SortOrderEnum.valueOf(s1).compareTo(SortOrderEnum.valueOf(s2));
    }
});

Без перечисления

Вы можете указать любую строку, которую хотите, я не видел смысла использовать перечисление в этом решении. Мы помещаем ожидаемый индекс для каждой строки в статическую карту. демонстрация

public class SortOrder {
    public static final Map<String, Integer> SORT_ORDER = initializeSortOrder();

    private static Map<String, Integer> initializeSortOrder() {
        List<String> orderedStrings = Arrays.asList(
                "A",
                "B",
                "D",
                "C",
                "E",
                "F"
        );
        Map<String, Integer> indexByString = new HashMap<>();
        for (int index = 0; index < orderedStrings.size(); ++index) {
            indexByString.put(orderedStrings.get(index), index);
        }
        return Collections.unmodifiableMap(indexByString);
    }
}

Сортировать по

Collections.sort(testData, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return SORT_ORDER.get(s1).compareTo(SORT_ORDER.get(s2));
    }
});

Обратите внимание, что это пример заполнения карты. Вы можете (лучше) заполнить карту string->index из файла конфигурации.

Вы также не можете поместить карту в статическую переменную, если это вызывает у вас проблемы.

person Volune    schedule 22.08.2014

По сути, вы довольны значением compareTo по умолчанию, но вам нужна небольшая разница, верно?

if (this.name.equals("D2") && that.name.equals("D1")) return -1;
if (this.name.equals("D1") && that.name.equals("D2")) return 1;
return super.compareTo(that);
person Carl Manaster    schedule 20.08.2014