订购枚举值

我想知道是否有任何方式为不同的类订购枚举。 例如,如果我有一组固定的化学物质,它们以不同的方式与其他化学物质发生反应,有些是强烈的,有些是微弱的。 我基本上希望能够根据组应该对之反应的化学物质(即取决于类别)来切换它们的排列顺序。 我知道我应该使用Comparable,但我不知道该怎么做。 如果我不够清楚,请发表评论,我会进一步解释。

谢谢。

public static enum Chem { H2SO4, 2KNO3, H20, NaCl, NO2 }; 

所以我有一些看起来像这样的东西,我已经知道每种化学物质会如何与其他化学物质发生反应。 我只是想根据它会与之反应的化学物质来安排Chems。 这就是我所拥有的一切。

实现不同的Comparator (参见http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html )

 Comparator comparator1 = new Comparator() { public int compare(MyEnum e1, MyEnum e2) { //your magic happens here if (...) return -1; else if (...) return 1; return 0; } }; //and others for different ways of comparing them //Then use one of them: MyEnum[] allChemicals = MyEnum.values(); Arrays.sort(allChemicals, comparator1); //this is how you sort them according to the sort critiera in comparator1. 

这是一个示例,显示根据不同条件排序的枚举的相同值:

 import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; public class SortEnum { public enum TestEnum { A(1, 2), B(5, 1), C(3, 0); private int value1; private int value2; private TestEnum(int value1, int value2) { this.value1 = value1; this.value2 = value2; } public int getValue1() { return value1; } public int getValue2() { return value2; } } public static void main(String[] args) { List list = Arrays.asList(TestEnum.values()); System.err.println(list); Collections.sort(list, new Comparator() { @Override public int compare(TestEnum o1, TestEnum o2) { return o1.getValue1() - o2.getValue1(); } }); System.err.println(list); Collections.sort(list, new Comparator() { @Override public int compare(TestEnum o1, TestEnum o2) { return o1.getValue2() - o2.getValue2(); } }); System.err.println(list); } } 

输出是

[A,B,C] [A,C,B] [C,B,A]

您可以根据需要在枚举中放置尽可能多的比较器,请参见下面的示例:

 import java.util.Comparator; public enum Day { MONDAY(1, 3), TUESDAY(2, 6), WEDNESDAY(3, 5), THURSDAY(4, 4), FRIDAY(5, 2), SATURDAY(6, 1), SUNDAY(0, 0); private final int calendarPosition; private final int workLevel; Day(int position, int level) { calendarPosition = position; workLevel = level; } int getCalendarPosition(){ return calendarPosition; } int getWorkLevel() { return workLevel; } public static Comparator calendarPositionComparator = new Comparator() { public int compare(Day d1, Day d2) { return d1.getCalendarPosition() - d2.getCalendarPosition(); } }; public static Comparator workLevelComparator = new Comparator() { public int compare(Day d1, Day d2) { // descending order, harder first return d2.getWorkLevel() - d1.getWorkLevel(); } }; } 

要查看比较器的运行情况:

 import java.util.Arrays; import java.util.Collections; import java.util.List; public class EnumDayTest { public static void main (String[] args) { List allDays = Arrays.asList(Day.values()); System.out.println("===\nListing days in order of calendar position:"); Collections.sort(allDays, Day.calendarPositionComparator); showItems(allDays); System.out.println("===\nListing days in order of work level:"); Collections.sort(allDays, Day.workLevelComparator); showItems(allDays); } public static void showItems(List days) { for (Day day : days) { System.out.println(day.name()); } } } 

假设你有一个元素枚举:

 enum Elements {Oxygen, Hydrogen, Gold} 

并且你想按给定的顺序对它们进行排序,然后我可以这样做:

 Elements[] myElements = Elements.values(); Arrays.sort(myElements, new ElementComparator()); 

其中ElementComparator可以是这样的:

 public class ElementComparator implements java.util.Comparator { public int compare(Elements left, Elements right){ return right.compareTo(left); //use your criteria here } } 

订购标准的性质在您的问题中不明确。 它似乎与化学反应有关。 我认为标准应该在Comparator以确定哪个枚举元素比另一个更大,因为化学反应。

你的意思是代表你的化学物质的实际物体是枚举物吗? 如果我可以说,那就像一个奇怪的实现那么太棒了:枚举真的更适合某些东西的“属性”。

但无论如何……如果你真的想把它们表示为枚举然后对它们进行排序,我建议实现一个可以对你的特定类型的枚举进行排序的比较器,然后在它的compare()方法中进行适当的比较,例如:

 Comparator comp = new Comparator() { public int compare(Chemical o1, Chemical o2) { if (o1.reactivity() > o2.reactivity()) { return 1; } else if (o1.reactivity() < o2.reactivity()) { return -1; } else { return integer depending on whatever else you want to order by... } } }; 

然后你可以将这个比较器传递给涉及的排序方法,有序集合构造函数等。

您可以扩展您的枚举子类以包含您需要的任何额外方法,例如reactive()。