浏览代码

Ajout operateur min et max

Arthur Brandao 6 年之前
父节点
当前提交
996671b213
共有 1 个文件被更改,包括 58 次插入0 次删除
  1. 58 0
      src/migl/lisp/operator/MinMaxOperator.java

+ 58 - 0
src/migl/lisp/operator/MinMaxOperator.java

@@ -0,0 +1,58 @@
+package migl.lisp.operator;
+
+import java.math.BigInteger;
+
+import migl.lisp.LispElement;
+import migl.lisp.LispError;
+import migl.lisp.LispOperator;
+import migl.util.ConsList;
+
+public class MinMaxOperator implements LispOperator {
+
+	@Override
+	public LispElement apply(String operator, ConsList<Object> lisp) throws LispError {
+		if(lisp.size() == 0) {
+			throw new LispError(LispError.ERR_NUM_ARG);
+		}
+		//Initialise avec la 1er valeur
+		LispElement elt = LispElement.getElement(lisp.car());
+		lisp = lisp.cdr();
+		BigInteger res = elt.toInt();
+		//Parcours les elements suivants
+		while(!lisp.isEmpty()) {
+			elt = LispElement.getElement(lisp.car());
+            if(elt.value.getClass() != BigInteger.class) break;
+            switch(operator) {
+				case "max":
+					res = res.max(elt.toInt());
+					break;
+				case "min":
+					res = res.min(elt.toInt());
+					break;
+				default:
+					throw new LispError(operator + LispError.ERR_UNKNOW);
+			}
+            lisp = lisp.cdr();
+		}
+		//Si on finit la liste avec que des entier on retourne
+        if(lisp.isEmpty()) return LispElement.generate(res);
+        //Sinon on continue en passant en double
+        double result = res.doubleValue();
+        while(!lisp.isEmpty()) {
+             double value = LispElement.getElement(lisp.car()).toNumber();
+             switch(operator) {
+				case "max":
+					result = (value > result) ? value : result;
+					break;
+				case "min":
+					result = (value < result) ? value : result;
+					break;
+				default:
+					throw new LispError(operator + LispError.ERR_UNKNOW);
+			}
+            lisp = lisp.cdr();
+        }
+        return LispElement.generate(result);
+	}
+
+}