2018年11月29日星期四

知乎日报: 有哪些用八个字连续说出来就包含三个成语的例子?

知乎日报
知乎日报 
有哪些用八个字连续说出来就包含三个成语的例子?
Nov 29th 2018, 12:08

路路,做点自己感兴趣的事,发现更大的世界。

考虑到自己能想起的成语数量实在有限,所以就把这个问题交给计算机来处理吧。

首先,很容易就在网上下载到了一个 access 格式的数据库,经检查实际存储了去重后的四字成语两万九千多个。导出为 txt 格式的文件。

然后打开了 eclipse ,写下了以下代码:

packagecom.example.chengyuconnect;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStreamReader;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjava.sql.DriverManager;publicclassChengyuConnect{staticString[]cy=newString[30000];staticString[]cy1=newString[30000];staticString[]cy2=newString[30000];publicstaticvoidmain(String[]args){getCy();splitCy();searchCy();}staticvoidgetCy(){try{Filef=newFile("F:\\chengyu.txt");InputStreamReaderreader=newInputStreamReader(newFileInputStream(f),"Unicode");BufferedReaderbr=newBufferedReader(reader);Stringline=br.readLine();for(intn=0;line.length()==4;n++){cy[n]=line;line=br.readLine();}}catch(Exceptione){e.printStackTrace();}}staticvoidsplitCy(){for(inti=0;i<cy.length&&cy[i+1]!=null;i++){cy1[i]=cy[i].substring(0,2);cy2[i]=cy[i].substring(2,4);}}staticvoidsearchCy(){for(inti=0;i<cy.length;i++)for(intj=0;j<cy.length;j++)if(cy2[i]!=null&&cy1[j]!=null&&cy2[i].equals(cy1[j]))for(intk=0;k<cy.length;k++)if(cy2[j]!=null&&cy1[k]!=null&&cy2[j].equals(cy1[k]))System.out.println(cy[i]+cy[k]);}}

大概的思路是:

  1. 读取 txt 文件里的成语,每次读取一行,将四字成语存储到一个数组里;
  2. 将成语的前两个字和后两个字分开存储到两个数组里;
  3. 根据题意,符合条件的三个成语,需要满足第一个成语的后两个字 ,是第二个成语的前两个字,第二个成语的后两个字,又是第三个成语的前两个字。所以写三个嵌套的循环,从存储了后两个字的数组开始,和存储了前两个字的数组作比较,如果两个字相同,就再使用后者对应的成语的后两个字,和存储了前两个字的数组作比较,如果还能发现相同的,就表示这三个成语符合条件。

运行,几秒钟就可以看到所有结果:

将结果复制粘贴到表格里,数量 2 万 5809:

全部结果就不发出来了,因为不知道知乎是否支持写 20 多万字的回答。


在表格的截图里,还有三个单元表,CY 看起来像是表示成语……嗯,这其实是一个失败的尝试。本想直接在表格里处理,可是没料到 VLOOKUP 函数处理速度太慢,几万条数据直接让表格崩溃了,所以最后就留一张测试部分的截图作为纪念吧。


2018.11.29 更新

感谢 @忠肝义胆吕奉先 在评论中指出回答里的一个问题:在输出的结果中,存在前后两个成语相同的情况,如果认为三个成语是互不相同的成语,则需要在代码中限制输出的是前后不相同的两个成语连接起来的八个字。

除了直接改代码,也可以把结果复制粘贴到表格里,在表格里进行判断和筛选,这样还能发现一批前后两个字互换位置,结果仍是成语的成语。

You are receiving this email because you subscribed to this feed at blogtrottr.com. By using Blogtrottr, you agree to our policies, terms and conditions.

If you no longer wish to receive these emails, you can unsubscribe from this feed, or manage all your subscriptions.

没有评论:

发表评论

"  割下心头肉   河北省阜城县古城镇西火星堂村曾发生过一起命案,受害者是个六个月不到的小女孩,而凶手,正是生她的母亲。小女孩刚从母亲肚子里出来,还没记住世界长什么样子,就被母亲砖头砸死。而造成这一切的罪魁祸首,便是李主佛的法轮功。   俗话说,孩子是母亲身上掉下的一...