📄 mathlibobject.java
字号:
package jmathlib.core.tokens;
import jmathlib.core.interpreter.*;
import jmathlib.core.tokens.numbertokens.*;
import java.util.*;
//import java.util.ArrayList;
/** */
public class MathLibObject extends DataToken
{
/**An array of all the data stored in the structure*/
private HashMap fields;
/**Create a new structure*/
public MathLibObject()
{
super(10, "struct");
fields = new HashMap();
}
/**Create a structure and copy it's data from another structure
@param oldVal = the structure to copy the values from*/
public MathLibObject(MathLibObject oldVal)
{
super(10, "struct");
fields = ((HashMap)oldVal.getFieldsHash().clone());
}
/**Set the value of one of the structures fields
@param fieldName = the name of the field to set
@param value = the value to set the field to*/
public void setField(String fieldName, OperandToken value)
{
Variable var = ((Variable)fields.get(fieldName));
if(var == null)
{
var = new Variable(fieldName, value);
fields.put(fieldName, var);
}
var.assign(value);
}
/**Get the value of a particular field
@param fieldName = the name of the field
@return the fields data*/
public OperandToken getFieldData(String fieldName)
{
ErrorLogger.debugLine("getfield");
Variable var = ((Variable)fields.get(fieldName));
if(var != null)
return var.getData();
return null;
}
/**Get the value of a particular field
@param fieldName = the name of the field
@return a variable pointing to the fields data*/
public Variable getFieldVariable(String fieldName)
{
Variable var = ((Variable)fields.get(fieldName));
if(var != null)
{
ErrorLogger.debugLine("getting field data");
return var;
}
return null;
}
/**@return a list of all fields*/
public Iterator getFields()
{
return fields.entrySet().iterator();
}
/**@return a list of all fields*/
public HashMap getFieldsHash()
{
return fields;
}
/**Turns the structure into a string*/
public String toString()
{
String result = "[";
Set entries = fields.entrySet();
Iterator iter = entries.iterator();
while(iter.hasNext())
{
Map.Entry entry = (Map.Entry)iter.next();
result += entry.getKey() + " = " + entry.getValue();
if(iter.hasNext())
result += ", ";
}
result += "]";
return result;
}
/**Evaluates the structure
@return the structure itself*/
public OperandToken evaluate(Token[] operands)
{
return this;
}
public OperandToken add(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.add(var.getData()));
}
else
{
result.setField(fieldName, var.getData());
}
}
}
return result;
}
public OperandToken subtract(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.subtract(var.getData()));
}
else
{
NumberToken temp = DoubleNumberToken.zero;
result.setField(fieldName, temp.subtract(var.getData()));
}
}
}
return result;
}
public OperandToken multiply(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.multiply(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
public OperandToken divide(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.divide(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
public OperandToken power(OperandToken arg)
{
MathLibObject result = new MathLibObject(this);
if(arg instanceof MathLibObject)
{
Iterator argFields = ((MathLibObject)arg).getFields();
while(argFields.hasNext())
{
Variable var = ((Variable)((Map.Entry)argFields.next()).getValue());
String fieldName = var.getName();
OperandToken data = getFieldData(fieldName);
if(data != null)
{
result.setField(fieldName, data.power(var.getData()));
}
else
{
result.setField(fieldName, DoubleNumberToken.zero);
}
}
}
return result;
}
//unary operations
/**calculate the factorial
@return the result as an OperandToken*/
public OperandToken factorial()
{
MathLibObject result = new MathLibObject();
Iterator fields = getFields();
while(fields.hasNext())
{
Variable var = ((Variable)((Map.Entry)fields.next()).getValue());
String fieldName = var.getName();
OperandToken data = var.getData();
result.setField(fieldName, data.factorial());
}
return result;
}
/**trigonometric functions - calculate the sine of this token
@return the result as an OperandToken*/
/* public OperandToken sin()
{
MathLibObject result = new MathLibObject();
Iterator fields = getFields();
while(fields.hasNext())
{
Variable var = ((Variable)((Map.Entry)fields.next()).getValue());
String fieldName = var.getName();
OperandToken data = var.getData();
result.setField(fieldName, data.sin());
}
return result;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -