日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java中使用es的dsl

我們大多數(shù)人已經(jīng)編寫了一些處理圖論算法的程序,例如找到兩個(gè)頂點(diǎn)之間的最短路徑,找到給定圖的最小生成樹等等。 在這些算法的每一種中,表示圖形的編程方式是使用鄰接矩陣或鄰接列表 。 兩者都不是定義圖形輸入的非常直觀的方法。 例如,如果未在正確的列和行中進(jìn)行輸入,則鄰接矩陣可能會(huì)導(dǎo)致錯(cuò)誤。 此外,在運(yùn)行時(shí),您不太確定哪個(gè)行/列代表哪個(gè)邊,當(dāng)涉及到具有大量頂點(diǎn)的圖形的輸入時(shí),事情會(huì)變得更加復(fù)雜。

在我的工程研究期間,我已經(jīng)用Java實(shí)現(xiàn)了許多圖形算法,并且在所有這些圖形算法中,我都嵌套了for循環(huán)以獲取鄰接矩陣輸入。 最近,當(dāng)我閱讀Martin Fowlers的DSL書籍時(shí),我想到了創(chuàng)建DSL來提供圖形輸入的想法,即DSL,它將允許用戶指定頂點(diǎn),邊及其權(quán)重。 我選擇了已實(shí)現(xiàn)的圖形算法,只是去除了鄰接矩陣輸入,而是使用了我創(chuàng)建的DSL。 該算法就像一個(gè)魅力。

在這篇文章中,我將通過采用不同的圖形輸入并為它們顯示DSL來顯示DSL的有效語法。 然后,我將向您展示我創(chuàng)建的庫,該庫由圖的語義模型,DSL的解析器和詞法分析器以及一個(gè)簡單的構(gòu)建器API組成,該API從DSL腳本中填充語義模型。 解析器和詞法分析器是使用ANTLR生成的,因此該庫要求ANTLR Jar在類路徑中可用。 最后,我將展示如何使用Kruskals算法將該DSL用于查找最小生成樹。

DSL語法和一些示例

下圖(g1)的DSL:

圖表G1

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

請注意,上述DSL中的元素之間存在不同的空間。 這只是為了顯示可以編寫DSL的不同方式。

下圖(g2)的DSL為:

圖G2

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

請注意,“圖形”和“ {”之間沒有空格。 這只是為了顯示它的不同編寫方式。

下圖(g3)的DSL為:

圖G3

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

現(xiàn)在顯示一些無效的DSL腳本:

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

上面的無效,因?yàn)轫旤c(diǎn)名稱以數(shù)字開頭。

Graph { }

上面的方法無效,因?yàn)镚raph希望至少定義一個(gè)頂點(diǎn)。 但是它可以具有零個(gè)或多個(gè)邊。

基于DSL的圖形輸入庫

我已經(jīng)利用ANTLR來完成為我為DSL定義的語法創(chuàng)建詞法分析器和解析器的所有任務(wù)。 這樣,我不必?fù)?dān)心創(chuàng)建解析器或擔(dān)心從DSL輸入腳本創(chuàng)建令牌。

解析器和詞法分析器類以及語義模型類一起打包到一個(gè)jar中,并且必須將這個(gè)jar與ANTLR jar一起包括在內(nèi),以利用編寫用于圖形輸入的DSL來使用。

DSL jar的結(jié)構(gòu)可以在下面的屏幕截圖中看到:

GraphDSL Jar

圖形包中的類與語義模型相對(duì)應(yīng),即,它們是通用類,可以在不考慮是否有人在使用DSL的情況下使用。 graph.dsl中的類對(duì)應(yīng)于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;

上面的語法有待改進(jìn),但作為我的第一次嘗試,我試圖將其保持在這個(gè)水平。

  • 從此處下載DSL jar(GraphDSL.jar)。
  • 從此處下載ANTLR jar(antlr-4.1-complete.jar)。

注意:此DSL是使用ANTLR版本4開發(fā)的。

對(duì)于使用ANTLR的外部DSL的推薦書是《 語言實(shí)現(xiàn)模式:創(chuàng)建自己的域》特定和通用編程語言

Kruskals算法找到最小生成樹

用于測試此算法實(shí)現(xiàn)的圖形為:

樣本圖

和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) }

讓我們看一下實(shí)現(xiàn):

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加載圖形數(shù)據(jù)。 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

并以圖解方式顯示相同的內(nèi)容

最小生成樹

參考:來自CG的合作伙伴 Mohamed Sanaulla在Experiences Unlimited博客上的基于DSL的方法,用于在基于圖論的Java程序中輸入圖數(shù)據(jù) 。

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

java中使用es的dsl

總結(jié)

以上是生活随笔為你收集整理的java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕亚洲欧美日韩在线不卡 | 精品视频在线观看一区二区 | 日韩怡春院 | 国产精品丝袜黑色高跟 | 青青青在线 | 国产麻豆一精品一男同 | 日韩亚洲国产欧美 | 老司机午夜性大片 | 欧美一区不卡 | 成年人黄色片 | 亚洲精品ww | 91视频网址入口 | 久久久网址 | 国产又粗又猛又爽又黄的网站 | 国产激情自拍 | 四虎影视成人永久免费观看亚洲欧美 | 国产又粗又猛视频免费 | 日本少妇喷水 | 97狠狠| 一区二区国产欧美 | 久久免费看视频 | 天海翼一区 | 久久天堂av综合合色蜜桃网 | 在线免费不卡视频 | 激情另类视频 | v片在线免费观看 | 人妻毛片 | 国产99在线播放 | 99色图| 男人爱看的网站 | 奇米四色在线观看 | 视频一区三区 | 国产伦精品一区二区三区 | 亚洲系列在线观看 | 一级性生活毛片 | 国产乱人对白 | 欧州一区| 久久久综合网 | 日韩精品三级 | 国产欧美日韩视频 | 日韩av电影网| 中文字幕在线观看免费视频 | 四虎影院永久地址 | 日韩天堂在线视频 | 日韩精品免费在线视频 | 西川结衣在线观看 | 国产精品视频免费看 | 日批视频免费播放 | 无码任你躁久久久久久老妇 | 视频一区在线观看 | 亚洲午夜精品久久久久久人妖 | 亚洲视频在线观看一区二区 | 中国农村一级片 | 法国少妇愉情理伦片 | 日韩aa视频 | 红桃av在线 | 日韩久久久久 | 青青草原在线免费观看视频 | 国产真实乱人偷精品人妻 | 日韩欧美亚洲一区二区 | 毛片基地在线观看 | 久久亚洲天堂 | 翔田千里88av中文字幕 | 亚洲精品毛片av | 日韩精品一区二区三区在线视频 | 高清av一区 | 蜜臀av一区二区三区有限公司 | 高清中文字幕mv的电影 | 99久热| 日本一区二区三区视频在线 | 污片免费观看 | 七月丁香婷婷 | 二区久久| 少妇闺蜜换浪荡h肉辣文 | 久久香蕉av| 69av一区二区三区 | www.人人草 | 天天射综合 | 一道本久在线中文字幕 | 6080电视影片在线观看 | 亚洲淫欲| 综合激情五月婷婷 | 亚洲精品喷潮一区二区三区 | 亚洲精品电影网 | 日本成人三级电影 | 超碰香蕉 | av在线短片| 操她视频网站 | 久久性生活 | 国产精品永久免费 | 国产重口老太伦 | 69精品人妻一区二区三区 | 国产精品电影网站 | av番号网 | 国产精品成人免费精品自在线观看 | 以女性视角写的高h爽文 | 欧美色图首页 | 日韩精品一区二区在线 | 性久久久久久久久久 |