Порядок значений перечисления

Мне было интересно, есть ли способ упорядочить перечисление для разных классов. Если, например, у меня есть фиксированная группа химических веществ, которые по-разному реагируют на другие химические вещества, некоторые сильно, некоторые слабо. В основном я хочу иметь возможность переключать порядок, в котором они расположены, в зависимости от химического вещества, на которое должна реагировать группа (т.е. в зависимости от класса). Я знаю, что должен использовать Comparable, но не знаю, как это сделать. Если я недостаточно ясен, оставьте комментарий, и я объясню дальше.

Спасибо.

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

Итак, у меня есть что-то похожее, и я уже знаю, как каждое химическое вещество будет реагировать на некоторые другие химические вещества. Я просто хочу упорядочить химию на основе химического вещества, с которым она будет реагировать. Это почти все, что у меня есть.


person Ester    schedule 05.05.2012    source источник
comment
Вы имеете в виду, что у вас есть список химических компонентов, которые вы хотите отсортировать по разным критериям?   -  person Guillaume Polet    schedule 06.05.2012
comment
Я бы не сказал список. Они относятся к типу enum.   -  person Ester    schedule 06.05.2012
comment
Определенно недостаточно ясно. Не могли бы вы показать код?   -  person Matt Ball    schedule 06.05.2012
comment
enum участники должны иметь допустимые идентификаторы Java. 2KNO3 не является допустимым идентификатором Java, поскольку он начинается с цифры.   -  person Mike Samuel    schedule 06.05.2012


Ответы (5)


Реализуйте различные 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.
person Mattias Isegran Bergander    schedule 05.05.2012

Вот пример, показывающий одни и те же значения перечисления, отсортированные по разным критериям:

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]

person Guillaume Polet    schedule 05.05.2012

Предположим, у вас есть перечисление элементов:

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 должны быть включены критерии, чтобы решить, какой элемент перечисления больше, чем другой, учитывая химическую реакцию.

person Edwin Dalorzo    schedule 05.05.2012

Вы можете поместить столько компараторов в перечисление, сколько хотите, см. пример ниже:

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());
    }
  }
}
person MaxZoom    schedule 14.01.2015

Вы имеете в виду, что фактические объекты, представляющие ваши химические вещества, являются перечислениями? Это оооочень странная реализация, если я могу сказать: перечисления действительно больше подходят для «свойств» чего-то.

Но в любом случае... если вы действительно хотите представить их как перечисления, а затем отсортировать их, я бы предложил реализовать компаратор, который может сортировать перечисления вашего конкретного типа, а затем в его методе 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...
        }
    }
};

Затем вы можете передать этот компаратор в метод сортировки, конструктор упорядоченной коллекции и т.д.

Вы можете расширить свой подкласс перечисления, включив в него любые дополнительные методы, например. реактивность(), которая вам нужна.

person Neil Coffey    schedule 05.05.2012