I have an enum class like the following:
public enum Letter {
OMEGA_LETTER("Omega"),
GAMMA_LETTER("Gamma"),
BETA_LETTER("Beta"),
ALPHA_LETTER("Alpha"),
private final String description;
Letter() {
description = toString();
}
Letter(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
Later down my code I basically iterate over the Letter enum and print its members out to the console:
for (Letter letter : Letter.values()) {
System.out.println(letter.getDescription());
}
I thought that the values() method would give me an ordered view of the enum (as mentioned here), but this is not the case here. I simply get the enum members in the order I created them within the Letter enum class. Is there a way to output the values of an enum in alphabetical order? Would I need a separate comparator object, or is there a built-in way to do this? Basically I would like the values to be alphabetically sorted based on the getDescription() text:
Alpha
Beta
Gamma
Omega
Just sort them using Arrays.sort and your own comparator.
Here's a generic way to do it with any class without having to implement Comparable on the class you're sorting or create a custom comparator. I've found instances where I don't want to override compareTo because it serves a different purpose, you can't for enums anyways, and constantly creating wrapper classes is a pain. You can pass in a function that outputs a Comparable object you'd like to use for sorting purposes.
The toComparable function is only called once per element in the list (not so for a custom comparator), so it's especially good if that call is expensive for some class. Null values are handled internally, so it's easier to use than a custom comparator. One call to Java 7's TimSort algorithm is drastically more efficient than doing a bunch of O(log N) inserts to a SortedMap (red-black tree or other balanced tree implementation). And you aren't restricted to any particular class or interface.
Real world performance increases are significant in many cases. For example, the performance increase is around 5x as fast as using a comparator when sorting Doubles using toString() on a list of size 100k.
Precisely, the order of declaration is considered significant for enums, so we are glad that they are returned in precisely that order. For example, when a
int i
represents an enum values, doingvalues()[i]
is a very simple and efficient way to find the enum instance. To go contrary-wise, theordinal()
method returns the index of an enum instance.What you call value is not something defined for enums in general. Here, in your context, you mean the result of
getDescription()
.As you say, you could create a Comparator for these descriptions. That would be perfect :-)
Note that in general, you could need several orders for these instances:
You could also push that notion of DescriptionComparator a little bit:
For performance reasons, you could store the computed descriptions.
Because enums can't inherit, code reuse has to be outside the enum class. Let me give the example we would use in our projects:
Now the code samples...
Note that the generic code in
EnumUtils
works not only for one enum class, but works for any enum class in your project that implements theDescribed
interface.As said before, the point of having the code outside of the enums (where it would otherwise belong) is to reuse the code. It's not big deal for two enums, but we have over a thousand enums in our project, many of them with the same interfaces...!
Or just reorder the declarations :-)
Edit: As KLE pointed out, this assumes that the Descriptions are unique within the enum.