如何将字符串转换为代数表达式

雅各布

因此,我正在尝试编写一个程序,该程序获得3x ^ 2 + x + 8之类的功能,然后用图形表示该功能。我正在使用eval()方法将String转换为表达式,但是它一直抛出NullPointerException。

package Function;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class FunctionGrapherTest 
{
public static void main(String[] args)
{
    JFrame frame = new JFrame();

    FunctionGrapherComponent comp = new FunctionGrapherComponent();
    frame.setSize(600, 600);

    frame.setTitle("Function");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    frame.add(comp);
    frame.getContentPane().add(comp.control(), BorderLayout.SOUTH);

    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int)((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int)((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, y);
}
}

package Function;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class FunctionGrapherComponent extends JPanel
{
private static final long serialVersionUID = 1L;
public FunctionGrapherComponent()
{
    JPanel field = new JPanel();

    JLabel y = new JLabel("y = ", SwingConstants.RIGHT);
    field.add(y);
    equaField = new JTextField(15);
    field.add(equaField);

    control = new JPanel();
    control.setLayout(new GridLayout(1, 3));

    control.add(field);
    JButton draw = makeButton("Graph");
    control.add(draw);

    count = 0;
}
public JPanel control()
{
    return control;
}
public JButton makeButton(String label)
{
    JButton button = new JButton(label);
    class ButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String equation = equaField.getText();
            if(!equation.equals("") || equation != null)
            {
                equa = equation;
                count = 1;
                repaint();
            }       
            equaField.setText("");
        }
    }
    ActionListener listener = new ButtonListener();
    button.addActionListener(listener);
    return button;
}
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    Axes axes = new Axes(xPixel(XMIN), xPixel(XMAX), yPixel(YMIN), yPixel(YMAX),
            xPixel(0), yPixel(0), sWidth(1), sHeight(1));
    axes.drawAxes(g2);
    axes.drawTicks(g2);

    if(count == 1)
    {
        Function func = new Function();
        delta = (XMAX - XMIN) / 100;
        for(double i = XMIN; i <= (XMAX - delta); i = i + delta)
        {
            x1 = xPixel(i);
            y1 = yPixel(func.functionVal(i, equa));
            x2 = xPixel(i + delta);
            y2 = yPixel(func.functionVal(i + delta, equa));
            func.plot(g2, x1, y1, x2, y2);
        }
        count = 0;
    }
}
public double xPixel(double xuser)                      
{
    return (xuser - XMIN) * (getWidth( ) - 1) / (XMAX - XMIN);
}
public double yPixel(double yuser)
{
   return (yuser - YMAX) * (getHeight( ) - 1) / (YMIN - YMAX);
}
public double sHeight(double yuser)
{
   return yuser * (getHeight() - 1) / (YMAX - YMIN);
}
public double sWidth(double xuser)
{
   return xuser * (getWidth() - 1) / (XMAX - XMIN);
}
private static final double XMIN = -100;        
private static final double XMAX = 100;
private static final double YMIN = -100;
private static final double YMAX = 100;
private double delta;
private double x1;
private double y1;
private double x2;
private double y2;
private int count;
private JPanel control;
private JTextField equaField;
private String equa;
}


package Function;

import java.awt.Graphics2D;
import java.awt.geom.Line2D;

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

public class Function
{
public Function()
{

}
public void plot(Graphics2D g2, double x1, double y1, double x2, double y2) 
{
    Line2D.Double seg = new Line2D.Double(x1, y1, x2, y2);
    g2.draw(seg);
}
public double functionVal(double x, String equa)
{
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("Java"); 
    try 
    {
        funcVal = (double)engine.eval(equa);
    } 
    catch (ScriptException e) 
    {}
    return funcVal;
}
private double funcVal;
}


package Function;

import java.awt.Graphics2D;
import java.awt.geom.Line2D;

public class Axes
{
public Axes(double xmin, double xmax, double ymin, double ymax,
        double xzero, double yzero, double xunit, double yunit)
{
    xMin = xmin;
    xMax = xmax;
    yMin = ymin;
    yMax = ymax;
    xZero = xzero;
    yZero = yzero;
    xUnit = xunit;
    yUnit = yunit;
}
public void drawAxes(Graphics2D g2) 
{
    Line2D.Double xAxis = new Line2D.Double(xMin, yZero, xMax, yZero);
    Line2D.Double yAxis = new Line2D.Double(xZero, yMin, xZero, yMax);
    g2.draw(xAxis);
    g2.draw(yAxis);
}
public void drawTicks(Graphics2D g2)
{
    for(double i = xZero + xUnit; i <= xMax; i = i + xUnit)
    {
        Line2D.Double tick = new Line2D.Double(i, yZero + TICK_LENGTH, i,      yZero - TICK_LENGTH);
        g2.draw(tick);
    }
    for(double i = xZero - xUnit; i >= xMin; i = i - xUnit)
    {
        Line2D.Double tick = new Line2D.Double(i, yZero + TICK_LENGTH, i, yZero - TICK_LENGTH);
        g2.draw(tick);
    }
    for(double i = yZero + yUnit; i <= yMin; i = i + yUnit)
    {
        Line2D.Double tick = new Line2D.Double(xZero + TICK_LENGTH, i, xZero - TICK_LENGTH, i);
        g2.draw(tick);
    }
    for(double i = yZero - yUnit; i >= yMax; i = i - yUnit)
    {
        Line2D.Double tick = new Line2D.Double(xZero + TICK_LENGTH, i, xZero - TICK_LENGTH, i);
        g2.draw(tick);
    }
}
private double xMin;    
private double xMax;
private double yMin;
private double yMax;
private double xZero;
private double yZero;
private double xUnit;
private double yUnit;
private static final double TICK_LENGTH = 3;
}
疯狂程序员

首先更改ScriptEngine engine = mgr.getEngineByName("Java");ScriptEngine engine = mgr.getEngineByName("javascript");,尽管有人认为Java不是一种脚本语言,但Java和JavaScript之间是有区别的

此外,您也不应忽略engine...引发的异常

try {
    System.out.println(equa);
    funcVal = ((Number) engine.eval(equa)).doubleValue();
} catch (ScriptException e) {
    e.printStackTrace();
}

如果您不ScriptEngine每次都重新创建电话,也可以更快地找到它functionVal

public static class Function {
    private final ScriptEngine engine;

    public Function() {
        ScriptEngineManager mgr = new ScriptEngineManager();
        engine = mgr.getEngineByName("javascript");
    }

    public void plot(Graphics2D g2, double x1, double y1, double x2, double y2) {
        Line2D.Double seg = new Line2D.Double(x1, y1, x2, y2);
        g2.draw(seg);
    }

    public double functionVal(double x, String equa) {
        try {
            System.out.println(equa);
            funcVal = ((Number) engine.eval(equa)).doubleValue();
        } catch (ScriptException e) {
        }
        return funcVal;
    }
    private double funcVal;
}

更新

因此,假设您想求解方程式3x^2 + x + 8,则需要给出x一些值...

engine.put("x", 10);

然后,您可以使用3*2^+x+8方程式...

funcVal = ((Number) engine.eval("3*2^+x+8")).doubleValue();

例如...

    public double functionVal(double x, String equa) {
        try {
            System.out.println(equa);
            engine.put("x", 10);
            funcVal = ((Number) engine.eval(equa)).doubleValue();
            System.out.println(equa + " = " + funcVal);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        return funcVal;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将字符串转换为lambda表达式?

来自分类Dev

如何将字符串转换为正则表达式

来自分类Dev

如何将字符串转换为python(Generator表达式)中的嵌套字典?

来自分类Dev

如何将正则表达式数据转换为全局字符串php

来自分类Dev

如何将PHP字符串转换为PHP正则表达式

来自分类Dev

如何将数组中的字符串转换为表达式?

来自分类Dev

将字符串扩展为代数表达式

来自分类Dev

将NCalc表达式转换为字符串

来自分类Dev

将字符串转换为 SymPy 表达式?

来自分类Dev

如何将字符串中的JS正则表达式文字转换为RegExp

来自分类Dev

如何将导入的SQL查询正确转换为SSRS中的表达式字符串

来自分类Dev

将for循环转换为将concat字符串转换为lambda表达式

来自分类Dev

将RGB字符串转换为RGBa字符串的正则表达式

来自分类Dev

如何将指定属性的lambda表达式转换为与asp.net mvc兼容的“名称”字符串来表示相同的内容?

来自分类Dev

如何将数学表达式拆分为标记?(字符串 -> [字符串])

来自分类Dev

C#:如何将十进制转换为字符串而不转换为指数表示

来自分类Dev

将正则表达式的空白字符从列表转换为字符串

来自分类Dev

Linq表达式转换为字符串

来自分类Dev

在java中将字符串转换为表达式

来自分类Dev

如何使用正则表达式将String转换为其他子字符串?

来自分类Dev

此python代码如何使用正则表达式sub()和group()将字符串转换为camelCase?

来自分类Dev

如何使用System.Linq.Dynamic.Core将复杂的查询字符串转换为lambda表达式

来自分类Dev

Perl正则表达式:如何在不带\“的情况下将字符串从”转换为“?

来自分类Dev

如何使用正则表达式或数组将输入字符串转换为所需(给定)格式?

来自分类Dev

Swift无法将表达式的类型“无效”转换为“字符串!”

来自分类Dev

无法将表达式的类型“无效”转换为“字符串!”

来自分类Dev

是否可以仅使用lambda表达式将字符串转换为int []?

来自分类Dev

将字符串/正则表达式转换为保存文件名的功能

来自分类Dev

将正则表达式字符串从Java转换为Python

Related 相关文章

  1. 1

    如何将字符串转换为lambda表达式?

  2. 2

    如何将字符串转换为正则表达式

  3. 3

    如何将字符串转换为python(Generator表达式)中的嵌套字典?

  4. 4

    如何将正则表达式数据转换为全局字符串php

  5. 5

    如何将PHP字符串转换为PHP正则表达式

  6. 6

    如何将数组中的字符串转换为表达式?

  7. 7

    将字符串扩展为代数表达式

  8. 8

    将NCalc表达式转换为字符串

  9. 9

    将字符串转换为 SymPy 表达式?

  10. 10

    如何将字符串中的JS正则表达式文字转换为RegExp

  11. 11

    如何将导入的SQL查询正确转换为SSRS中的表达式字符串

  12. 12

    将for循环转换为将concat字符串转换为lambda表达式

  13. 13

    将RGB字符串转换为RGBa字符串的正则表达式

  14. 14

    如何将指定属性的lambda表达式转换为与asp.net mvc兼容的“名称”字符串来表示相同的内容?

  15. 15

    如何将数学表达式拆分为标记?(字符串 -> [字符串])

  16. 16

    C#:如何将十进制转换为字符串而不转换为指数表示

  17. 17

    将正则表达式的空白字符从列表转换为字符串

  18. 18

    Linq表达式转换为字符串

  19. 19

    在java中将字符串转换为表达式

  20. 20

    如何使用正则表达式将String转换为其他子字符串?

  21. 21

    此python代码如何使用正则表达式sub()和group()将字符串转换为camelCase?

  22. 22

    如何使用System.Linq.Dynamic.Core将复杂的查询字符串转换为lambda表达式

  23. 23

    Perl正则表达式:如何在不带\“的情况下将字符串从”转换为“?

  24. 24

    如何使用正则表达式或数组将输入字符串转换为所需(给定)格式?

  25. 25

    Swift无法将表达式的类型“无效”转换为“字符串!”

  26. 26

    无法将表达式的类型“无效”转换为“字符串!”

  27. 27

    是否可以仅使用lambda表达式将字符串转换为int []?

  28. 28

    将字符串/正则表达式转换为保存文件名的功能

  29. 29

    将正则表达式字符串从Java转换为Python

热门标签

归档