我想知道是否有任何方法可以为不同的类订购枚举。例如,如果我有一组固定的化学物质,它们以不同的方式与其他化学物质发生反应,有些是强烈的,有些是弱的。我基本上希望能够根据组应该对的化学反应来改变它们的排列顺序(即取决于类别)。我知道我应该使用Comparable,但我不知道该怎么做。如果我不够清楚,请发表评论,我会进一步解释。
感谢。
public static enum Chem {
H2SO4, 2KNO3, H20, NaCl, NO2
};
所以我有一些看起来像这样的东西,我已经知道每种化学物质对其他一些化学物质的反应。我只是想根据它会与之反应的化学物质来安排Chems。这就是我所拥有的一切。
答案 0 :(得分:10)
实施不同的Comparator
(参见http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html)
Comparator comparator1 = new Comparator<MyEnum>() {
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.
答案 1 :(得分:4)
以下示例显示了根据不同条件排序的枚举值:
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<TestEnum> list = Arrays.asList(TestEnum.values());
System.err.println(list);
Collections.sort(list, new Comparator<TestEnum>() {
@Override
public int compare(TestEnum o1, TestEnum o2) {
return o1.getValue1() - o2.getValue1();
}
});
System.err.println(list);
Collections.sort(list, new Comparator<TestEnum>() {
@Override
public int compare(TestEnum o1, TestEnum o2) {
return o1.getValue2() - o2.getValue2();
}
});
System.err.println(list);
}
}
OUTPUT
[A,B,C] [A,C,B] [C,B,A]
答案 2 :(得分:1)
假设您有一个元素枚举:
enum Elements {Oxygen, Hydrogen, Gold}
并且您想按给定的顺序对它们进行排序,然后我可以这样做:
Elements[] myElements = Elements.values();
Arrays.sort(myElements, new ElementComparator());
其中ElementComparator
可以是:
public class ElementComparator implements java.util.Comparator<Elements> {
public int compare(Elements left, Elements right){
return right.compareTo(left); //use your criteria here
}
}
订购标准的性质在您的问题中并不明确。它似乎与化学反应有关。我认为标准应该放在Comparator
中,以确定哪个枚举元素比另一个更大,因为化学反应。
答案 3 :(得分:1)
您可以根据需要在枚举中放置尽可能多的比较器,请参阅下面的示例:
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<Day> calendarPositionComparator = new Comparator<Day>() {
public int compare(Day d1, Day d2) {
return d1.getCalendarPosition() - d2.getCalendarPosition();
}
};
public static Comparator<Day> workLevelComparator = new Comparator<Day>() {
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<Day> 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<Day> days) {
for (Day day : days) {
System.out.println(day.name());
}
}
}
答案 4 :(得分:0)
你的意思是代表你的化学物质的实际物体是枚举物吗?如果我可以这么说,那就像一个奇怪的实现那样:enums真的更适合某些东西的“属性”。
但无论如何......如果你真的想把它们表示为枚举然后对它们进行排序,我会建议实现一个可以对你的特定类型的枚举进行排序的比较器,然后在它的compare()方法中进行适当的比较,例如:
Comparator<Chemical> comp = new Comparator<Chemical>() {
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...
}
}
};
然后你可以将这个比较器传递给sort方法,有序集合构造函数等。
您可以扩展您的枚举子类以包含任何额外的方法,例如您需要的反应性()。