在 java 中使用 ScriptEngineManager 定义变量
Defining variable with ScriptEngineManager in java
我有以下class
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[]
作为参数,反转它和 return ListNode
.
用一个例子来说明行为 - 这是一个。
假设该方法采用 new char[]{'0', '8', '7'}
,因此它应该 return ListNode
具有值 7
(作为 int)的第一个节点,[=节点的 22=] 属性 应该是 8
的 .val
的新节点,并且 .next.next
必须是 val
是 [=27] 的节点=].
为此,我编写了以下方法:
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;
}
还有一种计算我需要多少 .next 的方法
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
嗯,所以你知道 this is about the missing variable?
我会重复一遍,特别是因为这个问题在标题中带有更好分析的问题。
您的脚本引擎在尝试解析 'finalNode' 变量时失败。原因是 finalNode 在 Java 中是已知的,但在 Java 脚本引擎中是未知的。所以你需要告诉脚本引擎如何解析变量。我没有测试代码,但它可能看起来有点像这样:
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);
我有以下class
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[]
作为参数,反转它和 return ListNode
.
用一个例子来说明行为 - 这是一个。
假设该方法采用 new char[]{'0', '8', '7'}
,因此它应该 return ListNode
具有值 7
(作为 int)的第一个节点,[=节点的 22=] 属性 应该是 8
的 .val
的新节点,并且 .next.next
必须是 val
是 [=27] 的节点=].
为此,我编写了以下方法:
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;
}
还有一种计算我需要多少 .next 的方法
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
嗯,所以你知道 this is about the missing variable? 我会重复一遍,特别是因为这个问题在标题中带有更好分析的问题。
您的脚本引擎在尝试解析 'finalNode' 变量时失败。原因是 finalNode 在 Java 中是已知的,但在 Java 脚本引擎中是未知的。所以你需要告诉脚本引擎如何解析变量。我没有测试代码,但它可能看起来有点像这样:
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);