4

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

谢谢。

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

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

4

5 回答 5

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.
于 2012-05-05T22:57:51.567 回答
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);
    }
}

输出是

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

于 2012-05-05T23:00:27.633 回答
2

假设您有一个元素枚举:

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给定化学反应的情况下,应该采用标准来决定哪个枚举元素比另一个更大。

于 2012-05-05T22:58:26.653 回答
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());
    }
  }
}
于 2015-01-14T23:46:07.900 回答
0

您的意思是代表您的化学品的实际对象是枚举?如果我可以说,这听起来像是一个奇怪的实现:枚举真的更适合某些东西的“属性”。

但是无论如何...如果您真的想将它们表示为枚举然后对它们进行排序,我建议您实现一个 Comparator 可以对您的特定类型的枚举进行排序,然后在其 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...
        }
    }
};

然后您可以将此比较器传递给所涉及的排序方法、有序集合构造函数等。

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

于 2012-05-05T22:58:44.450 回答