1

DB に 2 つのフィールドがsenti_opあり、senti_scoreどちらも Strings です。senti_scoreなどの値の文字列がDouble含まれているのに対し、 には 、 などの25.00関係演算子の文字列が含まれています。30.50senti_op>=><

Javaでは、次のようにしたい:

  • の場合senti_op >=、論理式を次のようにします。if ("some double value" >= senti_score)
  • のため<に、欲しいif ("some double value" < senti_score)

booleanこれらの関係式を作成し、その結果を後でコードの他の部分で使用できるようにしようとしています。

コンパイル可能な Java サンプル コードを提供してください。各演算子の文字列比較を使用して多くの if-else ステートメントを作成することを避け、値を評価し、小さくて実用的なソリューションを探しています。

私はそのようなことにかなり慣れていないので、すべての助けをいただければ幸いです。

4

3 に答える 3

4
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class SimpleTests {

    public static void main(String[] args) {
            ScriptEngineManager mgr = new ScriptEngineManager();
            ScriptEngine engine = mgr.getEngineByName("JavaScript");
            String exp = "some double value"+ senti_op +senti_score;
            try {
                System.out.println(engine.eval(exp));
            } catch (ScriptException e) {

                e.printStackTrace();
            }


    }
}
于 2013-06-23T08:04:53.593 に答える
1

Java 7 では、String で switch ステートメントを使用して if-else チェーンを記述することを回避できます。

また、浮動小数点演算も調べる必要があります。常に期待どおりに動作するとは限りません。

public class SentiEvaluator {

    public boolean evaluate(String sentiOp, String sentiScore, double otherValue) {
        if (sentiOp == null) {
            throw new IllegalArgumentException("Operator must be specified.");
        }
        if (sentiScore == null) {
            throw new IllegalArgumentException("Score must be specified.");
        }

        double score = Double.parseDouble(sentiScore);
        return evaluateJava7(score, sentiOp, otherValue);
    }

    private boolean evaluateJava7(double leftOp, String operator, double rightOp) {
        switch (operator) {
            case "=": return leftOp == rightOp;
            case ">": return leftOp > rightOp;
            case ">=": return leftOp >= rightOp;
            case "<": return leftOp < rightOp;
            case "<=": return leftOp <= rightOp;
            default: throw new IllegalArgumentException("Unknown operator " + operator);
        }
    }

}
于 2013-06-23T08:29:17.800 に答える
1

テストされていません (いくつかのlombokアノテーションといくつかのguavaを使用)

@RequiredArgsConstructor
private static enum Operation {
    LESS_OR_EQUAL("<="), GREATER_OR_EQUAL(">="), 
    GREATER(">"), LESS("<"), EQUALS("=");

    @Getter
    final String operation;

    public static Operation parse(final String val) {
        for(final Operation pop : values()) {
            if (pop.getOperation().equals(val)) {
                return pop;
            }
        }
        return null;
    }
}

public boolean handleOperation(final String senti_score, final String senti_op, final Double someDoubleVal) {
    // parse the double
    final Double sentiScore = Doubles.tryParse(senti_score);
    // parse the operation using Operation enum
    final Operation sentiOp = Operation.parse(senti_op);

    // TODO: checks for nullity on both parsed value

    // use a switch to compute result
    switch (sentiOp) {
    case LESS_OR_EQUAL:
        return someDoubleVal.compareTo(sentiScore) <= 1; 
    case GREATER_OR_EQUAL:
        return someDoubleVal.compareTo(sentiScore) >= 1;
    case LESS:
        return someDoubleVal.compareTo(sentiScore) < 1;
    case GREATER:
        return someDoubleVal.compareTo(sentiScore) > 1;
    case EQUAL:
        return someDoubleVal.compareTo(sentiScore) == 0;
    }
    throw new IllegalArgumentException("Unhandled op:" + senti_op);
}
于 2013-06-23T08:10:07.313 に答える