java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

java中使用es的dsl

我们大多数人已经编写了一些处理图论算法的程序,例如找到两个顶点之间的最短路径,找到给定图的最小生成树等等。 在这些算法的每一种中,表示图形的编程方式是使用邻接矩阵或邻接列表 。 两者都不是定义图形输入的非常直观的方法。 例如,如果未在正确的列和行中进行输入,则邻接矩阵可能会导致错误。 此外,在运行时,您不太确定哪个行/列代表哪个边,当涉及到具有大量顶点的图形的输入时,事情会变得更加复杂。

在我的工程研究期间,我已经用Java实现了许多图形算法,并且在所有这些图形算法中,我都嵌套了for循环以获取邻接矩阵输入。 最近,当我阅读Martin Fowlers的DSL书籍时,我想到了创建DSL来提供图形输入的想法,即DSL,它将允许用户指定顶点,边及其权重。 我选择了已实现的图形算法,只是去除了邻接矩阵输入,而是使用了我创建的DSL。 该算法就像一个魅力。

在这篇文章中,我将通过采用不同的图形输入并为它们显示DSL来显示DSL的有效语法。 然后,我将向您展示我创建的库,该库由图的语义模型,DSL的解析器和词法分析器以及一个简单的构建器API组成,该API从DSL脚本中填充语义模型。 解析器和词法分析器是使用ANTLR生成的,因此该库要求ANTLR Jar在类路径中可用。 最后,我将展示如何使用Kruskals算法将该DSL用于查找最小生成树。

DSL语法和一些示例

下图(g1)的DSL:

图表G1

图表G1

Graph {A1 -> B2 (12.3)B2 -> C3(0.98)C3->D4 (2)D4 ->E5 (12.45)
}

请注意,上述DSL中的元素之间存在不同的空间。 这只是为了显示可以编写DSL的不同方式。

下图(g2)的DSL为:

图G2

图G2

Graph{A1 -> B2 (12.3)B2 -> C3 (0.98)C3 -> D4 (2)E5
}

请注意,“图形”和“ {”之间没有空格。 这只是为了显示它的不同编写方式。

下图(g3)的DSL为:

图G3

图G3

Graph {A -> B (12.3)B -> C (0.98)C -> D (2)D -> E (12.45)
}

现在显示一些无效的DSL脚本:

Graph {1A -> B (12.3)B -> C (0.98)
}

上面的无效,因为顶点名称以数字开头。

Graph {
}

上面的方法无效,因为Graph希望至少定义一个顶点。 但是它可以具有零个或多个边。

基于DSL的图形输入库

我已经利用ANTLR来完成为我为DSL定义的语法创建词法分析器和解析器的所有任务。 这样,我不必担心创建解析器或担心从DSL输入脚本创建令牌。

解析器和词法分析器类以及语义模型类一起打包到一个jar中,并且必须将这个jar与ANTLR jar一起包括在内,以利用编写用于图形输入的DSL来使用。

DSL jar的结构可以在下面的屏幕截图中看到:

GraphDSL Jar

GraphDSL Jar

图形包中的类与语义模型相对应,即,它们是通用类,可以在不考虑是否有人在使用DSL的情况下使用。 graph.dsl中的类对应于ANTLR为lexer和parser生成的Java类。

ANTLR用于词法分析和解析的语法为:

grammar Graph;graph: GRAPH_START (edge|vertex)+ GRAPH_END;
edge: (vertex) TO (vertex) weight;
vertex: ID;
weight: '(' NUM ')';
GRAPH_START : 'Graph'([ ])*'{';
GRAPH_END : '}';
WEIGHT_START: '(';
WEIGHT_END: ')'; 
TO: '->';
ID: ^[a-zA-Z][a-zA-Z0-9]*;
NUM: [0-9]*[.]?[0-9]+;
WS: [ \t\r\n]+ -> skip;

上面的语法有待改进,但作为我的第一次尝试,我试图将其保持在这个水平。

  • 从此处下载DSL jar(GraphDSL.jar)。
  • 从此处下载ANTLR jar(antlr-4.1-complete.jar)。

注意:此DSL是使用ANTLR版本4开发的。

对于使用ANTLR的外部DSL的推荐书是《 语言实现模式:创建自己的域》特定和通用编程语言

Kruskals算法找到最小生成树

用于测试此算法实现的图形为:

样本图

样本图

和DSL相同的是:

Graph  {A -> B (7)B -> C (8)A -> D (5)B -> D (9)D -> E (15)D -> F (6)E -> F (8)E -> C (5)B -> E (7)E -> G (9)F -> G (11)
}

让我们看一下实现:

package kruskalsalgo;import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import graph.Edge;
import graph.Graph;
import graph.Vertex;
import graph.GraphBuilder;
import java.io.IOException;
import java.util.Comparator;public class KruskalsAlgorithm {public static void main(String[] args) throws IOException {//Load the graph data from the DSLGraph g = new GraphBuilder().buildGraph("graph.gr");ArrayList<Set> forest = new ArrayList<Set>();ArrayList<Edge> finalEdgeSet = new ArrayList<Edge>();//Creating disjoint set of vertices which represents the initial forestfor (Vertex v : g.getVertices()) {Set newSet = new Set();newSet.getVertexList().add(v);forest.add(newSet); //Creating Disjoint Sets}//sort the edges in the graph based on their weightCollections.sort(g.getEdges(), new Comparator<Edge>(){public int compare(Edge o1, Edge o2) {return o1.getWeight().compareTo(o2.getWeight());}});for (Edge edge : g.getEdges()) {//Find in which set the vertices in the edges belongint rep1 = Set.findRep(edge.getFromVertex(), forest);int rep2 = Set.findRep(edge.getToVertex(), forest);//If in different sets then merge them into one set and pick the edge.if (rep1 != rep2) {finalEdgeSet.add(edge);Set.Union(rep1, rep2, forest);}}System.out.println("The Minimum Spanning tree is");for (Edge edge : finalEdgeSet) {System.out.println("Vertex: " + edge.getFromVertex().getLabel() + " to Vertex: " + edge.getToVertex().getLabel());}System.out.println("");}//End of Main
}class Set {private ArrayList<Vertex> vertexList;private int representative;static int count;public Set() {vertexList = new ArrayList<Vertex>();this.representative = ++(Set.count);}//Find the set identifier in which the given vertex belongs to.public static int findRep(Vertex vertex, ArrayList<Set> forest) {int rep = 0;for (Set set : forest) {for (Vertex v : set.getVertexList()) {if (v.getLabel().equals(vertex.getLabel())) {return set.getRepresentative();}}}return rep;}//Find the set given the step identifier.public static Set findSet(int rep, ArrayList<Set> forest) {Set resultSet = null;for (Set set : forest) {if (set.getRepresentative() == rep) {return set;}}return resultSet;}//Merge the set into another and remove it from the main set.public static void Union(int rep1, int rep2, ArrayList<Set> forest) {Set set1 = Set.findSet(rep1, forest);Set set2 = Set.findSet(rep2, forest);for (Vertex v : set2.getVertexList()) {set1.getVertexList().add(v);}forest.remove(set2);}public ArrayList<Vertex> getVertexList() {return vertexList;}public int getRepresentative() {return representative;}
}

上面的代码从dslgraph.gr加载图形数据。 DSL脚本必须放置在资源包中,以便DSL库可以找到它。

上面代码的输出:

The Minimum Spanning tree is
Vertex: A to Vertex: D
Vertex: E to Vertex: C
Vertex: D to Vertex: F
Vertex: A to Vertex: B
Vertex: B to Vertex: E
Vertex: E to Vertex: G

并以图解方式显示相同的内容

最小生成树

最小生成树

参考:来自CG的合作伙伴 Mohamed Sanaulla在Experiences Unlimited博客上的基于DSL的方法,用于在基于图论的Java程序中输入图数据 。

翻译自: https://www.javacodegeeks.com/2013/07/dsl-based-approach-to-input-graph-data-in-graph-theory-based-java-programs.html

java中使用es的dsl

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 495. 提莫攻击(esay)(优质解法)

链接&#xff1a;495. 提莫攻击 代码&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int time0;for(int i1;i<timeSeries.length;i){if(timeSeries[i]-timeSeries[i-1]<duration){timetimeSeries[i]-timeSeries[i-1];…

基于高阶累积量的数字调制信号分类(Hierarchical Digital Modulation Classification Using Cumulants例1复现)

本文主要来源于2000年Swami经典文献Hierarchical Digital Modulation Classification Using Cumulants中例1的复现(文献共有15个实例,后续例子与例1实现方法类似,有问题欢迎留言),该论文是高阶累积量作信号调制识别分类的开篇之作,后续该方向的文献几乎都引用了Swami这篇…

Lambda运行时内部:窥视无服务器巢穴

有没有想过lambda里面是什么样的&#xff1f; 不要怀疑了 让我们找出答案。 自从2014年问世以来&#xff0c;AWS的lambda函数就成为了一个热门话题&#xff0c;在无服务器计算领域开辟了全新的历史。 无状态&#xff0c;零维护&#xff0c;按次执行的好东西实际上正在改变&…

基于(7, 5)归零非删余Turbo码的参数识别与分析

关注公众号【逆向通信猿】试读更多内容!!! 本文主要来源于复现文献的部分内容,有一定的参考价值: [1] 钟兆根, 吴昭军, 刘杰, 张立民. 高误码率下归零Turbo帧结构识别[J]. 电子学报. 2019(10). 文末有代码和参考文献网盘下载地址,有问题欢迎留言交流! 1 引言 随着现代…

给出一个正整数 nnn,请你计算从 111 到 nnn 的所有正整数中,有多少个数字的各位数和是 999,Java

题目描述&#xff1a; 给出一个正整数 nnn&#xff0c;请你计算从 111 到 nnn 的所有正整数中&#xff0c;有多少个数字的各位数和是 999&#xff1f; 输入格式&#xff1a; 输入一个不超过 100000010000001000000 的正整数 nnn。 输出格式&#xff1a; 输出一个整数表示答案…

【2020.12.30更新】信号处理常用公式(一)

积化和差 cos⁡αcos⁡β12[cos⁡(αβ)cos⁡(α−β)]\cos \alpha \cos \beta \frac{1}{2}[\cos (\alpha \beta ) \cos (\alpha - \beta )]cosαcosβ21​[cos(αβ)cos(α−β)]sin⁡αcos⁡β12[sin⁡(αβ)sin⁡(α−β)]\sin \alpha \cos \beta \frac{1}{2}[\sin (\al…

一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。现在我们已经知道了斜边长度c,请问这个直角三角形的两个直角边的长度是什么?Java

题目描述&#xff1a;一个直角三角形的两个直角边是 a,b(a≤b&#xff09;&#xff0c;其斜边是 c&#xff0c;且 a,b,c都是正整数。现在我们已经知道了斜边长度c&#xff0c;请问这个直角三角形的两个直角边的长度是什么&#xff1f; 输入格式&#xff1a;输入一个整数 c(1≤…

矩阵可逆的一种刻画方式

问题 若矩阵A满足AATIAA^{\rm{T}}IAATI&#xff0c;则A可逆。 证明一 反证法。假设A不可逆&#xff0c;则 ∃x0≠0\exists{x_0}\ne0∃x0​​0&#xff0c;使得Ax00A{x_0}0Ax0​0&#xff0c;则 x0AT(Ax0)T0T{x_0}{A^{\rm{T}}} {(A{x_0})^{\rm{T}}} {0^{\rm{T}}}x0​AT(A…

我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。Java洛谷传智杯

题目描述&#xff1a; 我们知道计算机的大小单位有 B, KB, MB 等&#xff0c;现在请你编写一个计算器进行大小单位换算。 输入格式&#xff1a;输入一个字符串&#xff0c;由一个 0 到 1023 之间的整数&#xff0c;一个单位名称&#xff08;大写字母&#xff09;&#xff0c;一…

eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API

eclipselink用于JSON处理的Java API&#xff08;JSR-353&#xff09;是作为Java EE 7的一部分引入的用于生成和使用JSON的Java标准。JSR-353包括对象&#xff08;类似于DOM&#xff09;和流&#xff08;类似于StAX&#xff09;API。 在本文中&#xff0c;我将演示我们在Eclipse…

传智杯Java志愿者传智专修学院总共召集了n位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花

Java实现思路&#xff1a;创建一个志愿者内部类&#xff0c;包括编号、服务时长、难度、贡献度属性。使用ArrayList将多个志愿者对象联系在一起。使用Collection的sort方法&#xff0c;重写compare方法进行按规则比较。 Java代码&#xff1a; import java.util.ArrayList; im…

将可见的电子签名添加到PDF

我知道这将是一个非常特殊的话题。 电子签名PDF远不是主流用例。 但是&#xff0c;我将其编写的原因有两个&#xff1a;第一&#xff0c;我认为它对真正需要它的人非常有用&#xff1b;第二&#xff0c;我认为随着eIDAS法规的普及&#xff0c;它将变得越来越普遍。电子签名在欧…

高斯白噪声下基于EM的多径时延估计

本文主要来源于复现文献的部分内容&#xff0c;有一定的参考价值&#xff1a; [1] 刘波. 基于EM的突发通信参数估计技术研究[D]. 2009. 文末有代码和参考文献网盘下载地址&#xff0c;有问题欢迎留言交流&#xff01; 1 引言 对于多径传播&#xff0c;接收信号是由源信号与它…

传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal

Java思路&#xff1a;使用String的字符串处理以及ArrayList的列表处理。 Java代码&#xff1a; import java.util.ArrayList; import java.util.Scanner; public class Main{public static ArrayList<String> list new ArrayList<>();public static void main(S…

新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段&#xff08;图片视频等&#xff09;五、Batch批量插入&#x1f646;&#x1f3fb;‍♀️&#x1f646;&#x1f3fb;‍♀️文末最新版jdbc jar包下载 &#x1f646;&#x1f3fb…

最优化理论与算法笔记

最优化理论与算法笔记

ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

ejbjpa很长时间以来&#xff0c;我听到很多人对Arquillian说好话 。 尽管我一直在阅读有关其用法的文章&#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然&#xff0c;我看起来还不够努力。 我要讲的要点是&#xff1a; 使用JPA。 我只是在这…

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…