Как я сортирую перечислимых участников в алфавитном порядке в Java?

рубин, рекурсивный

(factorial=Hash.new{|h,k|k*h[k-1]})[1]=1

использование:

factorial[5]
 => 120
12
задан denchr 14 November 2009 в 20:04
поделиться

3 ответа

SortedMap<String, Letter> map = new TreeMap<String, Letter>();
for (Letter l : Letter.values()) {
    map.put(l.getDescription, l);
}
return map.values();

Или просто измените порядок объявлений: -)

Изменить: Как указал KLE, это предполагает, что описания уникальны в пределах перечисления.

21
ответ дан 2 December 2019 в 04:43
поделиться

Просто отсортируйте их с помощью Arrays.sort и вашего собственного компаратора.

5
ответ дан 2 December 2019 в 04:43
поделиться

Я думал, что метод values ​​() даст мне упорядоченное представление перечисления (как упомянуто здесь), но здесь это не так. Я просто получаю члены перечисления в том порядке, в котором я их создал в классе перечисления Letter.

Точнее, порядок объявления считается важным для перечислений, поэтому мы рады, что они возвращаются именно в этом порядке. Например, когда int i представляет собой значения перечисления, выполнение values ​​() [i] - очень простой и эффективный способ найти экземпляр перечисления. В противном случае метод ordinal () возвращает индекс экземпляра перечисления.

Есть ли способ вывести значения перечисления в алфавитном порядке? Нужен ли мне отдельный объект компаратора или есть встроенный способ сделать это? В основном я хотел бы, чтобы значения были отсортированы в алфавитном порядке на основе текста getDescription ():

То, что вы называете значением , не определено для перечислений в целом. Здесь, в вашем контексте, вы имеете в виду результат getDescription () .

Как вы говорите, вы можете создать компаратор для этих описаний . Это было бы идеально: -)


Обратите внимание, что в целом вам может потребоваться несколько заказов для этих экземпляров :

  • порядок объявления (это официальный порядок)
  • порядок описания
  • другие по мере необходимости

Вы также можете немного продвинуть это понятие DescriptionComparator:

  1. По соображениям производительности, вы можете сохранить вычисленные описания.

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

Теперь примеры кода ...

/** Interface for enums that have a description. */
public interface Described {
  /** Returns the description. */
  String getDescription();
}

public enum Letter implements Described {
  // .... implementation as in the original post, 
  // as the method is already implemented
}

public enum Other implements Described {
  // .... same
}

/** Utilities for enums. */
public abstract class EnumUtils {

  /** Reusable Comparator instance for Described objects. */
  public static Comparator<Described> DESCRIPTION_COMPARATOR = 
    new Comparator<Described>() {
      public int compareTo(Described a, Described b) {
        return a.getDescription().compareTo(b.getDescription);
      }
    };

  /** Return the sorted descriptions for the enum. */
  public static <E extends Enum & Described> List<String> 
    getSortedDescriptions(Class<E> enumClass) {
      List<String> descriptions = new ArrayList<String>();
      for(E e : enumClass.getEnumConstants()) {
        result.add(e.getDescription());
      }
      Collections.sort(descriptions);
      return descriptions;
  }
}

// caller code
List<String> letters = EnumUtils.getSortedDescriptions(Letter.class);
List<String> others = EnumUtils.getSortedDescriptions(Other.class);

Обратите внимание, что общий код в EnumUtils работает не только для одного класса перечисления, но и работает для любого класса перечисления в вашем проекте, который реализует интерфейс Described .

Как было сказано ранее, смысл наличия кода вне перечислений (где он в противном случае должен был бы принадлежать) заключается в повторном использовании код. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!

Теперь примеры кода ...

/** Interface for enums that have a description. */
public interface Described {
  /** Returns the description. */
  String getDescription();
}

public enum Letter implements Described {
  // .... implementation as in the original post, 
  // as the method is already implemented
}

public enum Other implements Described {
  // .... same
}

/** Utilities for enums. */
public abstract class EnumUtils {

  /** Reusable Comparator instance for Described objects. */
  public static Comparator<Described> DESCRIPTION_COMPARATOR = 
    new Comparator<Described>() {
      public int compareTo(Described a, Described b) {
        return a.getDescription().compareTo(b.getDescription);
      }
    };

  /** Return the sorted descriptions for the enum. */
  public static <E extends Enum & Described> List<String> 
    getSortedDescriptions(Class<E> enumClass) {
      List<String> descriptions = new ArrayList<String>();
      for(E e : enumClass.getEnumConstants()) {
        result.add(e.getDescription());
      }
      Collections.sort(descriptions);
      return descriptions;
  }
}

// caller code
List<String> letters = EnumUtils.getSortedDescriptions(Letter.class);
List<String> others = EnumUtils.getSortedDescriptions(Other.class);

Обратите внимание, что общий код в EnumUtils работает не только для одного класса перечисления, но работает для любого класса перечисления в вашем проекте, который реализует Описанный интерфейс .

Как было сказано ранее, смысл наличия кода вне перечислений (где он в противном случае должен был бы принадлежать) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!

Теперь примеры кода ...

/** Interface for enums that have a description. */
public interface Described {
  /** Returns the description. */
  String getDescription();
}

public enum Letter implements Described {
  // .... implementation as in the original post, 
  // as the method is already implemented
}

public enum Other implements Described {
  // .... same
}

/** Utilities for enums. */
public abstract class EnumUtils {

  /** Reusable Comparator instance for Described objects. */
  public static Comparator<Described> DESCRIPTION_COMPARATOR = 
    new Comparator<Described>() {
      public int compareTo(Described a, Described b) {
        return a.getDescription().compareTo(b.getDescription);
      }
    };

  /** Return the sorted descriptions for the enum. */
  public static <E extends Enum & Described> List<String> 
    getSortedDescriptions(Class<E> enumClass) {
      List<String> descriptions = new ArrayList<String>();
      for(E e : enumClass.getEnumConstants()) {
        result.add(e.getDescription());
      }
      Collections.sort(descriptions);
      return descriptions;
  }
}

// caller code
List<String> letters = EnumUtils.getSortedDescriptions(Letter.class);
List<String> others = EnumUtils.getSortedDescriptions(Other.class);

Обратите внимание, что общий код в EnumUtils работает не только для одного класса перечисления, но работает для любого класса перечисления в вашем проекте, который реализует Описанный интерфейс .

Как было сказано ранее, смысл наличия кода вне перечислений (где он в противном случае должен был бы принадлежать) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!

смысл наличия кода вне перечислений (где он в противном случае принадлежал бы) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!

смысл наличия кода вне перечислений (где он в противном случае принадлежал бы) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!

6
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: