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

歡迎訪問 生活随笔!

生活随笔

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

java

如何在Java中对文件进行模式匹配和显示相邻行

發(fā)布時(shí)間:2023/12/3 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Java中对文件进行模式匹配和显示相邻行 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近,我們?cè)趈OOλ0.9.9中發(fā)布了有關(guān)超棒的窗口函數(shù)支持的文章 ,我相信這是對(duì)我們所做的庫的最佳補(bǔ)充。

今天,我們將在一個(gè)用例中研究窗口函數(shù)的出色應(yīng)用,該用例受到以下堆棧溢出問題Sean Nguyen的啟發(fā):

如何從Java 8流(如grep)匹配前后獲取行?

我有一個(gè)文本文件,其中有很多字符串行。 如果我想在grep中找到匹配之前和之后的行,我會(huì)這樣做:

grep -A 10 -B 10 "ABC" myfile.txt

如何使用流在Java 8中實(shí)現(xiàn)等效功能?

所以問題是:

如何使用流在Java 8中實(shí)現(xiàn)等效功能?

好吧,unix shell及其各種“可點(diǎn)入”命令是唯一比窗口函數(shù)更強(qiáng)大(更神秘)的東西。 能夠grep輸入文件中的某個(gè)字符串,然后顯示幾行的“窗口”非常有用。

但是,有了jOOλ0.9.9,我們也可以在Java 8中非常容易地做到這一點(diǎn) 。 考慮一下這個(gè)小片段:

Seq.seq(Files.readAllLines(Paths.get(new File("/path/to/Example.java").toURI()))).window().filter(w -> w.value().contains("ABC")).forEach(w -> {System.out.println();System.out.println("-1:" + w.lag().orElse(""));System.out.println(" 0:" + w.value());System.out.println("+1:" + w.lead().orElse(""));// ABC: Just checking});

該程序?qū)⑤敵?#xff1a;

-1: .window()0: .filter(w -> w.value().contains("ABC")) +1: .forEach(w -> {-1: System.out.println("+1:" + w.lead().orElse(""));0: // ABC: Just checking +1: });

因此,我自己運(yùn)行了該程序,并且找到了所有與“ ABC”匹配的行,以及前幾行(“ lagging” / lag() )和后幾行( lead() / lead() )。 這些lead()和lag()函數(shù)的工作方式與它們的SQL等效項(xiàng)相同 。

但是與SQL不同的是,用Java(或其他通用語言)編寫函數(shù)比較簡單,因?yàn)樯婕暗恼Z法較少。 我們可以輕松地在窗口框架上進(jìn)行聚合,以收集“滯后”和“領(lǐng)先”匹配的通用行數(shù)。 考慮以下替代方法:

int lower = -5; int upper = 5;Seq.seq(Files.readAllLines(Paths.get(new File("/path/to/Example.java").toURI()))).window(lower, upper).filter(w -> w.value().contains("ABC")).map(w -> w.window().zipWithIndex().map(t -> tuple(t.v1, t.v2 + lower)).map(t -> (t.v2 > 0 ? "+" : t.v2 == 0 ? " " : "") + t.v2 + ":" + t.v1).toString("\n"))

我們得到的輸出是這樣的:

-5:int upper = 5; -4: -3:Seq.seq(Files.readAllLines(Paths.get( -2: new File("/path/to/Example.java").toURI()))) -1: .window(lower, upper)0: .filter(w -> w.value().contains("ABC")) +1: .map(w -> w.window() +2: .zipWithIndex() +3: .map(t -> tuple(t.v1, t.v2 + lower)) +4: .map(t -> (t.v2 > 0 +5: ? "+"

它還能變得更簡潔嗎? 我不這么認(rèn)為。 上面的大多數(shù)邏輯只是在行旁邊生成索引。

結(jié)論

窗口功能非常強(qiáng)大。 最近關(guān)于reddit的討論(關(guān)于我們先前關(guān)于jOOλ的窗口函數(shù)支持的文章)顯示,其他語言也支持基元來構(gòu)建類似的功能。 但是通常,這些構(gòu)造塊并不像jOOλ中所公開的那樣簡潔,這是受SQL啟發(fā)的。

通過模仿SQL的窗口函數(shù),在內(nèi)存數(shù)據(jù)流上進(jìn)行強(qiáng)大的操作時(shí),只有很小的認(rèn)知摩擦。

在以下文章中了解有關(guān)窗口函數(shù)的更多信息:

  • 可能最酷的SQL功能:窗口函數(shù)
  • 使用此整齊的窗口函數(shù)技巧來計(jì)算時(shí)間序列中的時(shí)差
  • 如何在SQL中找到最長的連續(xù)事件系列
  • 不要錯(cuò)過具有FIRST_VALUE(),LAST_VALUE(),LEAD()和LAG()的超凡SQL能力
  • ROW_NUMBER(),RANK()和DENSE_RANK()之間的區(qū)別

翻譯自: https://www.javacodegeeks.com/2016/01/pattern-match-files-display-adjacent-lines-java.html

總結(jié)

以上是生活随笔為你收集整理的如何在Java中对文件进行模式匹配和显示相邻行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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