订购枚举值

时间:2012-05-05 22:48:14

标签: java enums comparable

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

感谢。

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

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

5 个答案:

答案 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方法,有序集合构造函数等。

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