将Java转换为C#(Unity) - java

我正在尝试将this Java code(使用Dijkstra的两栈算法评估算术表达式)转换为C#:

using System;
using System.Collections.Generic;
using System.IO;

public class Evaluate
{
    public double Eval(string expression)
    {
        Stack<string> ops = new Stack<string>();
        Stack<double> vals = new Stack<double>();

        string s = expression;
        while (!s.Equals(""))
        {
            if (s.Equals("(")) ;
            if (s.Equals("+")) ops.Push(s);
            else if (s.Equals("-")) ops.Push(s);
            else if (s.Equals("*")) ops.Push(s);
            else if (s.Equals("/")) ops.Push(s);
            else if (s.Equals("sqrt")) ops.Push(s);
            else if (s.Equals(")"))
            {
                string op = ops.Pop();
                double v = vals.Pop();
                if (op.Equals("+")) v = vals.Pop() + v;
                else if (op.Equals("-")) v = vals.Pop() - v;
                else if (op.Equals("*")) v = vals.Pop() * v;
                else if (op.Equals("/")) v = vals.Pop() / v;
                else if (op.Equals("sqrt")) v = Math.Sqrt(v);
                vals.Push(v);
            }
            else vals.Push(double.Parse(s));
        }
        return vals.Pop();
    }
}

但是当我尝试测试时,Unity停止工作。我做错了什么?

参考方案

您的代码表现正常。您没有将Java代码很好地转换为C#。我现在可以发现一个问题,但是当您解决此问题时,我不知道是否还有更多问题。

如果输入为空,则Java原始代码退出while循环。 Java代码如下所示:

while (!StdIn.isEmpty()) {
String s = StdIn.readString();  
......
......
}

它使用输入打破while循环。如果输入为空,则退出。

您的C#代码:

while (!s.Equals(""))
{
......
......
}

它使用s来打破while循环,但在循环中的任何位置都不会更改s。因此循环不断进行,这导致无限循环和Unity = Lock / Freeze中的无限循环,几乎没有例外。

修复#1。在另一个线程中调用Eval。不建议初学者使用。

修复#2。使用协程。

我的解决方案是使用协程。

将函数返回类型从double更改为Coroutine,然后将yield return null;放入while循环中。要调用该函数,请使用StartCoroutine(Eval("Your Expression"));yield return null;的使用将防止Unity崩溃。

即使这样做,当您传递一个非空的值时,您的代码仍然不会退出,但不会再锁定/冻结。

要解决此问题并从Java复制代码,您应该找到一种使用输入退出程序的方法。

转到GameObject-> UI-> Input字段,然后将该GameObject重命名为EvalInput;

现在,使用“输入”字段和下面的代码使C#代码的外观和功能更像Java代码。最终结果存储在全局evalResult变量中。

InputField evalInput;
void Start()
{
    StartCoroutine(Eval("Your Expression"));
    evalInput = GameObject.Find("EvalInput").GetComponent<InputField>();
}

double evalResult = 0;
public IEnumerator Eval(string expression)
{
    Stack<string> ops = new Stack<string>();
    Stack<double> vals = new Stack<double>();
    string s = expression;
    while (!s.Equals(""))
    {
        s = evalInput.text; //Modify the string here (Empty string == Exit)

        if (s.Equals("(")) ;
        if (s.Equals("+")) ops.Push(s);
        else if (s.Equals("-")) ops.Push(s);
        else if (s.Equals("*")) ops.Push(s);
        else if (s.Equals("/")) ops.Push(s);
        else if (s.Equals("sqrt")) ops.Push(s);
        else if (s.Equals(")"))
        {
            string op = ops.Pop();
            double v = vals.Pop();
            if (op.Equals("+")) v = vals.Pop() + v;
            else if (op.Equals("-")) v = vals.Pop() - v;
            else if (op.Equals("*")) v = vals.Pop() * v;
            else if (op.Equals("/")) v = vals.Pop() / v;
            else if (op.Equals("sqrt")) v = System.Math.Sqrt(v);
            vals.Push(v);
        }
        else vals.Push(double.Parse(s));

        yield return null;
    }
    evalResult = vals.Pop();
}

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

Java:自定义异常错误 - java

$ javac TestExceptions.java TestExceptions.java:11: cannot find symbol symbol : class test location: class TestExceptions throw new TestExceptions.test("If you see me, excepti…