Посмотрев на этот вопрос , вы сможете узнать, как Java обрабатывает сравнения типов через интерфейсы Comparable и Comparator .
Конечно, они предназначены для более сложных ситуаций, чем эта, но я думаю, вы должны принять их во внимание, чтобы вы могли увидеть правильный способ работы с набором алгоритмов упорядочения, предоставляемых стандартной библиотекой Java.
Поскольку вы не можете переопределить Enum по умолчанию compareTo (он объявлен как final ), вы можете реализовать свой собственный Comparator следующим образом:
public class OperatorsComparator implements Comparator<Operators> {
@Override
public int compare(Operators o1, Operators o2) {
return o1.getPrecedence() - o2.getPrecedence();
}
}
Тогда вам понадобится какой-то способ найти правильное Operators
значение из char
, которое вы даете:
private static Operators findOperator(char c){
for(Operators op : Operators.values()){
if(op.getOperator() == c)
return op;
}
return null;
}
Используя вычитание между двумя предыдущими и предыдущими поисковыми системами Operators
, вы можете реализовать свой isLowerPrecedence
метод следующим образом:
public static boolean isLowerPrecedence(char c1, char c2) throws Exception {
Operators o1 = findOperator(c1);
Operators o2 = findOperator(c2);
if(o1 == null || o2 == null)
throw new Exception("Invalid operators");
return new OperatorsComparator().compare(o1, o2) <= 0;
}
Сравнив таким образом приоритеты, вы получите, что o1
будет помечен как более низкий приоритет, даже если он имеет тот же приоритет, что и o2
, как поведение по умолчанию.
Остерегайтесь символов, которые вы пытаетесь использовать в качестве оператора, так как вам нужно поймать Exception
, если что-то пойдет не так
Пример выполнения:
System.out.println(isLowerPrecedence('+', '-'));
System.out.println(isLowerPrecedence('+', '*'));
System.out.println(isLowerPrecedence('/', '-'));
System.out.println(isLowerPrecedence('/', '*'));
System.out.println(isLowerPrecedence('*', '-'));
печатает эти сообщения:
true
true
false
true
false