(factorial=Hash.new{|h,k|k*h[k-1]})[1]=1
использование:
factorial[5]
=> 120
SortedMap<String, Letter> map = new TreeMap<String, Letter>();
for (Letter l : Letter.values()) {
map.put(l.getDescription, l);
}
return map.values();
Или просто измените порядок объявлений: -)
Изменить: Как указал KLE, это предполагает, что описания уникальны в пределах перечисления.
Просто отсортируйте их с помощью Arrays.sort и вашего собственного компаратора.
Я думал, что метод values () даст мне упорядоченное представление перечисления (как упомянуто здесь), но здесь это не так. Я просто получаю члены перечисления в том порядке, в котором я их создал в классе перечисления Letter.
Точнее, порядок объявления считается важным для перечислений, поэтому мы рады, что они возвращаются именно в этом порядке. Например, когда int i
представляет собой значения перечисления, выполнение values () [i]
- очень простой и эффективный способ найти экземпляр перечисления. В противном случае метод ordinal ()
возвращает индекс экземпляра перечисления.
Есть ли способ вывести значения перечисления в алфавитном порядке? Нужен ли мне отдельный объект компаратора или есть встроенный способ сделать это? В основном я хотел бы, чтобы значения были отсортированы в алфавитном порядке на основе текста getDescription ():
То, что вы называете значением , не определено для перечислений в целом. Здесь, в вашем контексте, вы имеете в виду результат getDescription ()
.
Как вы говорите, вы можете создать компаратор для этих описаний . Это было бы идеально: -)
Обратите внимание, что в целом вам может потребоваться несколько заказов для этих экземпляров :
Вы также можете немного продвинуть это понятие DescriptionComparator:
По соображениям производительности, вы можете сохранить вычисленные описания.
Поскольку перечисления не могут наследоваться, повторное использование кода должно быть вне класса перечисления. Позвольте мне привести пример, который мы будем использовать в наших проектах:
Теперь примеры кода ...
/** 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
работает не только для одного класса перечисления, но работает для любого класса перечисления в вашем проекте, который реализует Описанный интерфейс
.
Как было сказано ранее, смысл наличия кода вне перечислений (где он в противном случае должен был бы принадлежать) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!
смысл наличия кода вне перечислений (где он в противном случае принадлежал бы) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...! смысл наличия кода вне перечислений (где он в противном случае принадлежал бы) заключается в повторном использовании кода. Для двух перечислений это не проблема, но в нашем проекте более тысячи перечислений, многие из которых имеют одинаковые интерфейсы ...!