以波兰表示法的简单形式合并两个arraylists

Kyt*_*yte 7 java arraylist mongodb polish-notation

我有两个String类型的arraylists,一个操作数和一个操作符

ArrayList<String> operands = new ArrayList<String>();
ArrayList<String> operators = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

它们就像这样填充

operands = { "\"symbol\": \"CHKP%\"", "\"price\": {$gt: 23.72\" };
operators = { "and"};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会将其转换为一个像这样填充的ArrayList

ArrayList<String> polishNotation = { "and", 
                   "\"symbol\": \"CHKP%\"", 
                   "\"price\": {$gt: 23.72\" };
Run Code Online (Sandbox Code Playgroud)

将波兰表示法硬编码为三个元素很容易,但我有不同数量的运算符和操作数(最多四个操作数和三个运算符).此代码用于将SQL select语句转换为MongoDB.find()语句.任何关于如何以波兰表示法(前缀波兰表示法)实现ArrayList合并的指针都将非常感激.

[编辑2]下面是一个带有3个运算符("like","和","<")和三个操作数('FLIR%',"price","price")的SQL语句的示例,它与MongoDB等效.我认为使用波兰表示法可以帮助我将SQL的查询顺序转换为Mongo排序的查询

在SQL中

SELECT * FROM STOCK WHERE symbol like 'FLIR%' and price > 24.04 and price < 24.39;
Run Code Online (Sandbox Code Playgroud)

在MongoDB中

db.STOCK.find({
    "symbol": "FLIR%",
    "price": {
        "$gt": 24.04,
        "$lt": 24.39
    }
}
Run Code Online (Sandbox Code Playgroud)

Sya*_*m S 4

如果您要编写这样的解析器,那么这将是一个相当大的项目,因为 sql 查询可能会变得越来越复杂。您可以尝试使用ANTLR。它有一个sql语法。或者GeneralSqlParser或其他解析器来标记您的 sql 语句,然后构造您的 mongo 语句。

如果您对编写程序不感兴趣,您可以依赖Query Mongo 项目。它可以满足您的需要。请参考该网站。

如果您仍然决心通过 Java 快速解决此问题,您可以尝试以下程序。这使用jsoup将查询提交到 querymongo 站点并检索 mongo 查询。

希望这可以帮助 :)

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class MongoQuery {

    public static void main(String[] args) throws Exception {

        System.setProperty("http.proxyHost", "10.9.248.37");
        System.setProperty("http.proxyPort", "18082");

        Document doc = Jsoup.connect("http://www.querymongo.com/")
                .data("MySQLQuery", "SELECT * FROM STOCK WHERE symbol like 'FLIR%' and price > 24.04 and price < 24.39")
                .post();

        for(Element e : doc.select("#mongoQuery")){
            System.out.println(e.val());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)