在 java 中使用 ScriptEngineManager 定义变量

Posted

技术标签:

【中文标题】在 java 中使用 ScriptEngineManager 定义变量【英文标题】:Defining variable with ScriptEngineManager in java 【发布时间】:2021-11-12 13:52:38 【问题描述】:

我有以下课程

class ListNode

    int val;
    ListNode next;
    ListNode() 
    ListNode(int val)  this.val = val; 
    ListNode(int val, ListNode next)  this.val = val; this.next = next; 

希望它是不言自明的,val 是一个整数(节点的值),next 指的是下一个节点。

我还有以下方法,它应该以char[] 作为参数,将其反转并返回ListNode

用一个例子来说明行为 - 这是一个。

假设该方法采用new char[]'0', '8', '7',因此它应该返回ListNode,第一个节点的值为7(作为int),该节点的.next属性应该是带有@987654331的新节点@ 属于8,并且.next.next 必须是其中val0 的节点。

为此,我编写了以下方法:

public static ListNode addTwoNumbersTo(char[] finalDigitsToReverse)

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");

    int finalDigitsArrayLength = finalDigitsToReverse.length;

    ListNode finalNode = new ListNode();

    if (finalDigitsArrayLength > 0)
    
        finalNode.val = Integer.parseInt(String.valueOf(finalDigitsToReverse[finalDigitsArrayLength - 1]));

        int j = 1;
        for (int i = finalDigitsArrayLength - 2; i >= 0; i--)
        
            try
            
                // Here I'm desperately trying to set .next property and calculate how many .nexts I need
                engine.eval(returnNumberOfNexts(j));
            
            catch (ScriptException e)
            
                System.out.println(e);
            

            j++;
        
    

    return finalNode;

还有一种计算我需要多少 .nexts 的方法

public static String returnNumberOfNexts(int nextCounter)

    String finalDotNextString = "finalNode";

    if (nextCounter > 0)
    
        for (int i = 0; i < nextCounter; i++)
        
            finalDotNextString += ".next";
        
    

    finalDotNextString += " = new ListNode(Integer.parseInt(String.valueOf(finalDigitsToReverse[i])));";

    return finalDotNextString;

但它给了我以下错误:

javax.script.ScriptException: ReferenceError: "finalNode" is not defined in <eval> at line number 1

所以,这一切都与修复定义变量有关。但问题是如何定义。

我为这个糟糕的代码道歉,但这是我能想到的最好的。使用临时变量并在循环中更新它们是编程中最糟糕的事情。它就在我头上,我不知道它是如何工作的,它根本不是人类可读的。所以我想只使用一个变量并使我自己的解决方案工作。度过了美好的 3 天,我不想放弃。

顺便说一句,这是 leetcode Add Two Numbers 问题的一部分

【问题讨论】:

【参考方案1】:

嗯,所以你知道this is about the missing variable? 我再重复一遍,特别是因为这个问题在标题中包含了更好的分析问题。

您的脚本引擎在尝试解析“finalNode”变量时失败。原因是 finalNode 在 Java 中是已知的,但在 javascript 引擎中却不是。所以你需要告诉脚本引擎如何解析变量。我没有测试代码,但它可能看起来有点像这样:

ListNode finalNode = new ListNode();
ScriptEngine engine = manager.getEngineByName("js");
Bindings bindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
if (bindings==null) 
    bindings = engine.createBindings();
    engine.setBindings(ScriptContext.GLOBAL_SCOPE);

bindings.put("finalNode", finalNode);
engine.eval(codeToExecute);

【讨论】:

以上是关于在 java 中使用 ScriptEngineManager 定义变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中使用引用?

在 Java 6 和 Java 7 中使用透明窗口

怎样在java程序中使用java启动flume

在java中使用数组有啥好处啊?

在Java中使用预定义的类名作为类或变量名称

java 使用数组在java中打印偶数列