java读取codetable_LintCode/GenerateCodeTable.java at master · Dr11ft/LintCode · GitHub

import java.io.*;

import java.util.*;

/*

Used to generate table of contents.

- No args: generate GitHub table

- args == 'wordpress', generate WordPress table.

- args == 'review', generate Review Page

- args == 'all', genereate both table

*/

public class GenerateCodeTable {

private static final String NOT_AVAILABLE = "N/A";

/*

TableRow, used to hold table object and sort by date.

*/

private static class TableRow {

private long date = 0;

private String fileName;

private String level;

private String tutorialLink;

private String note;

private List tags;

public TableRow(

long date,

String fileName,

String level,

String tutorialLink,

String note,

List tags) {

this.date = date;

this.fileName = fileName;

this.level = level;

this.tutorialLink = tutorialLink;

this.note = note;

this.tags = tags;

}

public long getDate() {

return this.date;

}

public String getFileName() {

return this.fileName;

}

public String getLevel() {

return this.level;

}

public String getTutorialLink() {

return this.tutorialLink;

}

public String getNote() {

return this.note;

}

public List getTags() {

return this.tags;

}

public String getTableComposedLine() {

return "|[" + this.fileName + "](https://github.com/awangdev/LintCode/blob/master/Java/" + fileName.replace(" ", "%20")

+ ")|" + this.level + "|Java|" + this.tags + "|"+ this.tutorialLink + "|\n";

}

}

public final static String TUTORIAL_KEY_WORD = "tutorial:";

public final static String TAGS_KEY_WORD = "tags:";

public static void main(String[] args) {

GenerateCodeTable gct = new GenerateCodeTable();

//Read Java Solution Folder

File folder = new File("./Java");//"." = current path

if (!folder.exists() || !folder.isDirectory()) {

System.out.println("Check Directory:1");

return;

}

File[] listOfFiles = folder.listFiles();

if (listOfFiles == null) {

System.out.println("Check Directory:2");

return;

}

String outputContent = "";

File outFile;

if (args.length == 0){

outputContent = gct.generateREADME(listOfFiles);

gct.printTable("README.md", outputContent);

} else if (args != null && args[0].contains("wordpress")) {//Wordpress

outputContent = gct.generateWordPressPage(listOfFiles);

gct.printTable("WordPress.txt", outputContent);

} else if (args != null && args[0].contains("review")) {//Review Page

outputContent = gct.generateReviewPage(listOfFiles);

gct.printTable("ReviewPage.md", outputContent);

} else if (args != null && args[0].contains("tags")) {//Wordpress

outputContent = gct.generateTagREADME(listOfFiles);

gct.printTable("TagREADME.md", outputContent);

} else if (args != null && args[0].contains("all")) {

outputContent = gct.generateREADME(listOfFiles);

gct.printTable("README.md", outputContent);

//outputContent = generateWordPressPage(listOfFiles);

//printTable("WordPress.txt", outputContent);

outputContent = gct.generateReviewPage(listOfFiles);

gct.printTable("ReviewPage.md", outputContent);

outputContent = gct.generateTagREADME(listOfFiles);

gct.printTable("TagREADME.md", outputContent);

outputContent = gct.generateTagReviewPage(listOfFiles);

gct.printTable("TagReviewPage.md", outputContent);

outputContent = gct.generateLevelReviewPage(listOfFiles);

gct.printTable("LevelReviewPage.md", outputContent);

}

System.out.println("Mission Accomplished. Now go ahead and commit");

}

/*

Output the content into file

*/

public void printTable(String fileName, String outputContent) {

//System.out.println(outputContent);

//Write to README.md

try {

File outFile = new File(fileName);

FileOutputStream fop = new FileOutputStream(outFile);

byte[] contentInBytes = outputContent.getBytes();

fop.write(contentInBytes);

fop.flush();

fop.close();

} catch (IOException e) {

e.printStackTrace();

}

}

/*

Generate Wordpress contents

*/

public String generateWordPressPage(File[] listOfFiles) {

//Assemble output

String outputContent = "Java Solutions to algorithm problems from LintCode, LeetCode...etc.\n" +

"

"" +

"

" +

"

#" +

"

Problem" +

"

Language" +

"

" +

"

" +

"

";

int count = 0;

for (File file : listOfFiles) {

if (file.getName().contains(".java")) {

//outputContent += "|" + count + "|[" + file.getName() + "](https://github.com/awangdev/LintCode/blob/master/Java/"+ file.getName() +")| |" + "Java|\n";

outputContent+=

"

" +

"

" + count + "" +

"

" + file.getName() + "" +

"

Java" +

"

";

count++;

}

}

outputContent += "

";

return outputContent;

}

/*

Generate GitHub ReadMe contents

*/

public String generateREADME(File[] listOfFiles) {

//Assemble output

String outputContent = "# Java Algorithm Problems\n\n" +

"### 程序员的一天\n" +

"从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就会来维护这个repo, 给刷题的朋友们一些我的想法和见解. 下面来简单介绍一下这个repo:\n\n" +

"**README.md**: 所有所做过的题目\n\n" +

"**ReviewPage.md**: 所有题目的总结和归纳(不断完善中)\n\n" +

"**KnowledgeHash2.md**: 对所做过的知识点的一些笔记\n\n" +

"**SystemDesign.md**: 对系统设计的一些笔记\n\n" +

"**Future Milestone**: 我准备将一些有意思的题目,做成视频的形式给大家参考\n\n" +

//"**借此机会, 正式介绍一下自己, 以及我背后的大老板**\n\n" +

//"[![介绍一下自己!](https://img.youtube.com/vi/3keMZsV1I1U/0.jpg)](https://youtu.be/3keMZsV1I1U)\n\n" +

"希望大家学习顺利, 对未来充满希望(程序员也是找到好老板的!)\n" +

"有问题可以给我写邮件(wangdeve@gmail.com), 或者在GitHub上发issue给我.\n\n" +

"| Squence | Problem | Level | Language | Tags | Video Tutorial|\n" +

"|:-------:|:--------------|:------:|:---------:|:----:|:-------------:|\n";

final List tableRows = getTableRows(listOfFiles);

for (int i = 0; i < tableRows.size(); i++) {

outputContent += "|" + i + tableRows.get(i).getTableComposedLine();

}

return outputContent;

}

/* Generate the tags Table*/

public String generateTagREADME(File[] listOfFiles) {

String outputContent = generateTableOfContent("TagREADME.md") + "\n\n";

String header = "| Squence | Problem | Level | Language | Tags | Video Tutorial|\n" +

"|:-------:|:--------------|:------:|:---------:|:----:|:-------------:|\n";

final List tableRows = getTableRows(listOfFiles);

final HashMap> tagToRows = new HashMap<>();

tableRows.forEach(tableRow -> {

for (String tag: tableRow.getTags()) {

if (tag == null || tag.length() == 0) {

continue;

}

if (!tagToRows.containsKey(tag)) {

tagToRows.put(tag, new ArrayList());

}

tagToRows.get(tag).add(tableRow);

}

});

// Build View

List>> entries = new ArrayList<>(tagToRows.entrySet());

entries.sort(Comparator.comparing(entry -> -entry.getValue().size()));

for (Map.Entry> entry : entries) {

StringBuffer sb = new StringBuffer(" \n \n \n## " + entry.getKey() + " (" + entry.getValue().size() + ")\n");

sb.append(header);

List entryTableRows = entry.getValue();

entryTableRows.sort(Comparator.comparing(row -> String.join(",", row.getTags())));

for (int i = 0; i < entryTableRows.size(); i++) {

sb.append("|" + i + entryTableRows.get(i).getTableComposedLine());

}

outputContent += sb.toString() + "\n\n\n";

}

return outputContent;

}

// Generate review files by tags

public String generateTagReviewPage(File[] listOfFiles) {

final List tableRows = getTableRows(listOfFiles);

final HashMap> tagToRows = new HashMap<>();

// Group by tags:

tableRows.forEach(tableRow -> {

for (String tag: tableRow.getTags()) {

if (tag == null || tag.length() == 0) {

continue;

}

if (!tagToRows.containsKey(tag)) {

tagToRows.put(tag, new ArrayList());

}

tagToRows.get(tag).add(tableRow);

}

});

// Build View

String outputContent = "";

for (Map.Entry> entry : tagToRows.entrySet()) {

StringBuffer sb = new StringBuffer(" \n \n \n## " + entry.getKey() + " (" + entry.getValue().size() + ")\n");

sb.append(buildReviewSection(entry.getValue()));

outputContent += sb.toString() + "\n\n\n";

printTable("review/" + entry.getKey() + ".md", sb.toString());

}

return outputContent;

}

// Generate review files by levels

public String generateLevelReviewPage(File[] listOfFiles) {

final List tableRows = getTableRows(listOfFiles);

final HashMap> levelToRows = new HashMap<>();

// Group by levels:

tableRows.forEach(tableRow -> {

String level = tableRow.getLevel();

if (NOT_AVAILABLE.equals(tableRow.getLevel())) {

level = "NA";

}

if (!levelToRows.containsKey(level)) {

levelToRows.put(level, new ArrayList());

}

levelToRows.get(level).add(tableRow);

});

// Build View

String outputContent = "";

for (Map.Entry> entry : levelToRows.entrySet()) {

StringBuffer sb = new StringBuffer(" \n \n \n## " + entry.getKey() + " (" + entry.getValue().size() + ")\n");

sb.append(buildReviewSection(entry.getValue()));

outputContent += sb.toString() + "\n\n\n";

printTable("review/level/" + entry.getKey() + ".md", sb.toString());

}

return outputContent;

}

/*

Generate Review Page contents

Review Page content:

1. Sequence

2. Name

3. Difficulty

4. Summary of solution, key points.

*/

public String generateReviewPage(File[] listOfFiles) {

//Assemble output

String outputContent = "# Review Page\n\n" +

"This page summarize the solutions of all problems. For thoughts,ideas written in English, refer to deach individual solution. \n" +

"New problems will be automatically updated once added.\n\n";

final List tableRows = getTableRows(listOfFiles);

int count = 0;

int countMiss = 0;

outputContent += buildReviewSection(tableRows);

return outputContent;

}

private String buildReviewSection(List tableRows) {

int count = 0;

int countMiss = 0;

StringBuffer sb = new StringBuffer();

for (TableRow tableRow: tableRows) {

// Skip non-ready items

if (NOT_AVAILABLE.equals(tableRow.getLevel())) {

System.out.println(countMiss + ". [File not yet formatted]: " + tableRow.getFileName() + " [Skipping. Please revisit]");

countMiss++;

continue;

}

//System.out.println(count + ". " + tableRow.getLevel() + " [File not yet formatted]: " + tableRow.getFileName());

sb.append("**" + count + ". [" + tableRow.getFileName());

sb.append("](https://github.com/awangdev/LintCode/blob/master/Java/");

sb.append(tableRow.getFileName().replace(" ", "%20") +")**");

sb.append(" Level: " + tableRow.getLevel() + " Tags: " + tableRow.getTags() + "\n");

sb.append(" " + tableRow.getTutorialLink() + "\n");

sb.append(tableRow.getNote() + "\n");

sb.append("\n---\n\n");

count++;

}

return sb.toString();

}

private List getTableRows(File[] listOfFiles) {

final ArrayList tableRows = new ArrayList<>();

for (File file : listOfFiles) {

if (file.getName().contains(".java")) {

tableRows.add(getTableRow(file.getName()));

}

}

Collections.sort(tableRows, Comparator.comparing(TableRow::getDate));

return tableRows;

}

private TableRow getTableRow(String fileName) {

TableRow tableRow = null;

String tutorialLink = "";

String calculatedLevel = NOT_AVAILABLE;

long timestamp = 0;

List tags = new ArrayList<>();

try {

final BufferedReader reader = new BufferedReader(new InputStreamReader(

new FileInputStream("Java/" + fileName), "UTF-8"));

// Get level

String line = reader.readLine().trim();

if (line.length() == 1 && !calculateLevel(line).isEmpty()){

calculatedLevel = calculateLevel(line.toUpperCase());

line = reader.readLine().trim();

}

// Get timestamp

if (line.length() != 0) {

try{

timestamp = Long.parseLong(line);

line = reader.readLine().trim();

}catch(final Exception e){

System.out.println("Timestamp Not added yet: " + fileName);

}

}

// Get tutorial

if (line.contains(TUTORIAL_KEY_WORD)) {

tutorialLink = "[Link](" + line.substring(TUTORIAL_KEY_WORD.length()) + ")";

line = reader.readLine().trim();

}

// Get Tags

if (line.contains(TAGS_KEY_WORD)) {

// Do something

String tagLine = line.substring(TAGS_KEY_WORD.length());

for (String tag : tagLine.split(",")) {

tags.add(tag.trim());

}

Collections.sort(tags);

}

// Get Note

String note = "";

while ((line = reader.readLine()) != null && !line.equals("```") && !line.equals("/*")) {

note += line + "\n";

}

// Get result

tableRow = new TableRow(timestamp, fileName, calculatedLevel, tutorialLink, note, tags);

} catch (final Exception e) {

System.err.format("IOException: %s%n", e);

}

return tableRow;

}

private String calculateLevel(final String level) {

switch(level) {

case "N" :

return "Naive";

case "E" :

return "Easy";

case "M" :

return "Medium";

case "H" :

return "Hard";

case "S" :

return "Super";

case "R" :

return "Review";

}

return NOT_AVAILABLE;

}

// Build the table of contents of the page. Need to have 'gh-md-toc' installed

private String generateTableOfContent(String fileName) {

StringBuffer sb = new StringBuffer();

try {

Runtime rt = Runtime.getRuntime();

String[] commands = {"./gh-md-toc", fileName};

Process proc = rt.exec(commands);

BufferedReader stdInput = new BufferedReader(new

InputStreamReader(proc.getInputStream()));

BufferedReader stdError = new BufferedReader(new

InputStreamReader(proc.getErrorStream()));

// read the output from the command

System.out.println("Here is the standard output of the command:\n");

String s = null;

while ((s = stdInput.readLine()) != null) {

if (!s.contains("[gh-md-toc]") && !s.contains("table-of-contents")) {

sb.append(s.trim() + "\n");

}

}

// read any errors from the attempted command

System.out.println("Here is the standard error of the command (if any):\n");

while ((s = stdError.readLine()) != null) {

System.out.println(s);

}

} catch (final Exception e) {

System.err.format("IOException: %s%n", e);

}

System.out.println(sb.toString());

return sb.toString();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值