【问题标题】:how does the java operator work?java运算符是如何工作的?
【发布时间】:2016-05-30 08:52:03
【问题描述】:

所以我试图在我的 simpleDB 数据库中实现加法运算符。我完成了大部分工作,但我不知道如何添加这两个部分。所以这将用于数据库查询,我希望能够添加左侧和右侧。可以使用哪些 java 方法来做到这一点?因为在 simpleDB 中没有加法运算符。

这就是我实现 的方式

 if (operator.equals("<") && lhsval.compareTo(rhsval) < 0) {
         return true;
      }

我现在有

 Constant lhsval = lhs.evaluate(s);
      Constant rhsval = rhs.evaluate(s);
    if (operator.equals("+")) {
             // return ;
           }

我有左边和右边 因此,当查询看到 + 号时,它会将 em 添加在一起并返回答案。但我不知道怎么做。当我实现小于运算符时,我使用了 comprateTo 方法,当我执行等于运算符时,我使用了 equals 方法。我不知道我可以为加法运算符使用什么。顺便说一句,这是使用 java

常量类

package simpledb.query;

/**
 * The interface that denotes values stored in the database.
 * @author Edward Sciore
 */
public interface Constant extends Comparable<Constant> {

   /**
    * Returns the Java object corresponding to this constant.
    * @return the Java value of the constant
    */
   public Object  asJavaVal();
}

【问题讨论】:

  • 不太清楚,您是否尝试连接将发送到数据库以获取记录的查询的各个组件?
  • 你试试lhsval.concat(rhsval)
  • 也不能使用 concat,它没有实现。这就是让这很难的原因哈哈
  • 您始终可以使用lhsval.asJavaVal() 获取Integer。这些可以正常添加并返回为new IntConstant。
  • 什么是Constant??你创建了一些类??

标签: java database database-schema


【解决方案1】:

因为Constant类型实现了Comparable,所以实现了A比B小的关系运算符。

如果要实现A+B这样的关系运算符,那么Constant类型必须实现Addable这样的类型吗?我认为是的,它必须这样做。

    Constant lhsval = lhs.evaluate(s);
    Constant rhsval = rhs.evaluate(s);
    if (operator.equals("+")) {
        return lhsval.add(rhsval);
    }

Addable 接口有这个契约:

    interface Addable extends RelationalOperator {
        Constant add(Constant lhs, Constant rhs);    
    }

您必须决定加法运算符的工作方式(连接、求和,取决于常量子类型,...)

问题更新后编辑

一个简单的实现是使用方法Object asJavaVal();如下:

    Constant lhsval = lhs.evaluate(s);
    Constant rhsval = rhs.evaluate(s);
    if (operator.equals("+")) {
        Object lhsObj = lhs.asJavaVal();
        Object rhsObj = lhs.asJavaVal();  
        // here check for null and same type of lhs, rhs
        ...
        // now use typed implementation of + 
        if (lhsObj instanceof BigDecimal)
           return new ConstantImpl(lhsval.add(rhsval));
        else if (lhsObj instanceof String)
           return new ConstantImpl(lhsval + rhsval);
        else if (lhsObj instanceof ...) 
           return new ConstantImpl(...);
        else
            throw new IllegalArgumentException("Not a valid type for + :"+ lhsObj.getClass());
    }

【讨论】:

  • 是的,除非我将您链接到具有 simpleDB 软件包的站点,以便您可以在 eclipse 上运行它并查看所有代码,否则我很难理解这些内容。但我怀疑有人愿意这样做,哈哈。感谢帮助 。看看你说的对我有没有帮助
  • @henryzo 我不保证我能看到所有代码,但如果你想链接 simpleDB 的完整实现,我会看看它。
  • csns.calstatela.edu/wiki/content/cysun/course_materials/cs422/… 你应该看看解析代码和术语代码
  • @henryzo 我查看了源代码并阅读了论文cs.bc.edu/~sciore/papers/SIGCSE07.pdf。回答你的问题不是那么简单。首先,我认为您应该更改问题的标题,因为 SimpleDB 具有很强的特殊性。
【解决方案2】:

我认为,最好检查 lhsval 和 rhsval 的类型。之后,您可以通过 asJavaVal 获取已知类型的值:

Constant lhsval = lhs.evaluate(s);
Constant rhsval = rhs.evaluate(s);
Constant res = null;
if (operator.equals("+")) {
    if (lhsval instanceof IntConstant) {
        int sum = (Integer) lhsval.asJavaVal() + (Integer) rhsval.asJavaVal();
        res = new IntConstant(sum);
    } else if (lhsval instanceof StringConstant) {
        String sum = ((String) lhsval.asJavaVal()).concat((String) rhsval.asJavaVal());
        res = new StringConstant(sum);
    } else {
        throw new IllegalArgumentException("Unknown constant type");
    }
}

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 2014-01-17
    • 1970-01-01
    • 2016-10-25
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多