支持 http://ifeve.com/tao-code-match-1/ ,用fork-join来实现
读取一个文件中的单词(使用BufferedReader按行读取),排序(使用fork-join框架快速排序),写到另一个文件中(使用BufferedWriter進行寫入)
代码在github上:https://github.com/chenzehe/wordsorter-java
SortMain.java
package com.chenzehe.wordsorter; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.concurrent.ForkJoinPool; /** * * @description 读取一个文件中的字符(使用BufferedReader按行读取),排序(使用fork-join框架快速排序),写到另一个文件中( * 使用BufferedWriter進行寫入) * @author chenzehe * @email hljuczh@163.com * @create 2013年12月3日 下午2:56:49 */ public class SortMain { private static SortMain instance = null; private String[] words; private final int THREADS = 12; /** * @param args */ public static void main(String[] args) { Date start = new Date(); SortMain sortMain = SortMain.getInstance(); if (args == null || args.length < 1) { args = new String[2]; args[0] = sortMain.getClass().getClassLoader().getResource("") .getPath() + "com/chenzehe/wordsorter/sowpods.txt"; args[1] = sortMain.getClass().getClassLoader().getResource("") .getPath() + "com/chenzehe/wordsorter/out.txt"; } sortMain.getWordsFromInput(args[0]); sortMain.sort(); sortMain.writeWordsToOutput(args[1]); Date end = new Date(); long timeDiff = end.getTime() - start.getTime(); System.out.println("total:" + timeDiff + "ms"); } /** * 调用fork-join框架快速排序 */ public void sort() { Date start = new Date(); ForkJoinSortTask wordsSortTask = new ForkJoinSortTask(words); ForkJoinPool forkJoinPool = new ForkJoinPool(THREADS); forkJoinPool.invoke(wordsSortTask); Date end = new Date(); long timeDiff = end.getTime() - start.getTime(); System.out.println("sort:" + timeDiff + "ms"); } /** * 按行读取文件保存到集合中 使用BufferedReader按行读取 * * @param inputFile * @return */ public void getWordsFromInput(String inputFile) { Date start = new Date(); FileReader fileReader = null; BufferedReader bufferedReader = null; try { fileReader = new FileReader(inputFile); bufferedReader = new BufferedReader(fileReader); String linevalue; int i = 0; while ((linevalue = bufferedReader.readLine()) != null) { // 文件第一行保存行数 if (words == null) { words = new String[Integer.parseInt(linevalue) + 1]; } words[i] = linevalue; i += 1; } } catch (Exception e) { e.printStackTrace(); } finally { try { bufferedReader.close(); fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } Date end = new Date(); long timeDiff = end.getTime() - start.getTime(); System.out.println("read file:" + timeDiff + "ms"); } /** * 把经过排序的集合中的字符写到文件中 使用BufferedWriter進行寫入 * * @param outputFile */ public void writeWordsToOutput(String outputFile) { Date start = new Date(); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(outputFile); bufferedWriter = new BufferedWriter(fileWriter); for (int i = 0; i < words.length; i++) { String outputWord = (i == words.length - 1) ? words[i] : words[i] + "\n"; bufferedWriter.write(outputWord); } } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedWriter.close(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } Date end = new Date(); long timeDiff = end.getTime() - start.getTime(); System.out.println("write file:" + timeDiff + "ms"); } private static SortMain getInstance() { if (instance == null) { instance = new SortMain(); } return instance; } }
ForkJoinSortTask.java
package com.chenzehe.wordsorter; import java.util.concurrent.RecursiveAction; /** * * @description 使用fork-join框架,快速排序算法对数组进行排序 * @author chenzehe * @email hljuczh@163.com * @create 2013年12月3日 下午2:56:49 * */ public class ForkJoinSortTask extends RecursiveAction { private static final long serialVersionUID = -1738015707066879398L; public final String[] words; final int lo; final int hi; public ForkJoinSortTask(String[] array) { this.words = array; this.lo = 0; this.hi = array.length - 1; } public ForkJoinSortTask(String[] array, int lo, int hi) { this.words = array; this.lo = lo; this.hi = hi; } @Override protected void compute() { if (hi - lo > 0) { int pivot = partition(words, lo, hi); ForkJoinSortTask left = new ForkJoinSortTask(words, lo, pivot - 1); ForkJoinSortTask right = new ForkJoinSortTask(words, pivot + 1, hi); invokeAll(left, right); } } /** * 对数组进行分区操作,并返回中间元素位置 */ private int partition(String[] array, int lo, int hi) { String x = array[hi]; int i = lo - 1; for (int j = lo; j < hi; j++) { if (array[j].compareTo(x) <= 0) { i++; swap(array, i, j); } } swap(array, i + 1, hi); return i + 1; } private void swap(String[] array, int i, int j) { if (i != j) { String temp = array[i]; array[i] = array[j]; array[j] = temp; } } }
相关推荐
有文本文件a.txt,每行一个英文单词。编制Java程序,读取该文件中的所有单词,然后按照单词长度降序排列;对于长度相等的单词,按照字典顺序降序排列。最后将排序后的单词按每个一行写入另一个文件b.txt。
.java文件 java 入门 从键盘读取数字 排序 键盘输入 java 入门 从键盘读取数字 排序 键盘输入 java 入门 从键盘读取数字 排序 键盘输入
编写一个Java程序,读取一个文本文件,并统计文件中每个单词的出现次数。 编写一个Java程序,实现一个简单的计算器,可以进行加、减、乘、除运算。 定义一个接口Shape,包含计算面积和计算周长的方法。创建两个类...
读取包含单词排序列表(每行一个单词,没有空格,全部小写)的文件的程序,然后识别文件中最长的单词,该单词可以通过连接在文件中找到的较短单词的副本来构造。 用法 - 建立一个程序: git clone ...
从一片文档中提取出所有的单词(word),然后计算每个单词出现的频率(次数),按照一定的次序将排序好的单词以“word(频率)”的形式打印出来。 可以按照频率高低,或者单词顺序打印所有出现的单词。
6. 请给出Java代码,实现从一个文本文件中读取数据并排序的过程。 7. 请简述Java中的集合框架,并给出一个实例。 8. 请简述Java中的IO操作,并给出一个实例。 9. 请给出Java代码,实现一个简单的TCP/IP客户端程序。 ...
以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...
Java下使用for循环实现转从最后一个字符开始遍历,2) 遍历的当前字符如果是大写字母,就使用toLowerCase()方法将其转换为小写字母, 如果是小写字母则使用toUpperCase() 方法将其转换为大写字母
与关系必须返回同时包含这二个单词的文档集合,或关系返回包含这二个单词中的任何一个的文档集合; 可以计算每个命中的文档的得分,并根据文档得分对结果集排序; 在控制台显示命中的文档的详细信息,如文档的路径、...
java 排序源码
介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...
//在Java Applet中绘制一行文字:“这是一个Java Applet 程序” g.setColor(Color.red); g.setFont(new Font("宋体",Font.BOLD,36)); g.drawString("我改变了字体",20,50);//在Java Applet中绘制一行文字:“我...
§1.3 一个完整的 Java程序.............................................................................................6 1.3.1 Java程序的结构 .........................................................
#Scrabble 最佳单词查找器 从架子上的字母中找到我可以从... 对于幂集中的每个集合,对集合中的字母组成的单词进行排序,并检查它是否存在于 anagramCollections 中。 如果存在,则存储排序后的单词。 找出 n 个得
编写一个程序,读取由小写字母组成的单词“字典”,每行一个单词,并计算所有字谜类。 例如,单词pots是单词stop的字谜,因为一个单词中的字母是另一个单词中字母的排列。 单词tops 、 opts 、 post和spot属于同一...
它以字符串流的形式读取/tweet_input目录中的所有文件,然后解析它们,计算其中的所有单词频率,然后将结果作为txt文件输出到/tweet_output/ft1.txt中。 更详细地讲,我将所有文件作为字符串流读取,然后使用...
Word_Score_Team_4 本程序读取一组字符串。 每个角色都有一个与之相关的特定分数。 单词根据其个人得分进行排序。
洞察数据工程挑战的自述文件陈畅 注意:我的程序需要 java-1.7 字数: 逐行读取每个文件解析每一行假设总共有 n 个单词。 由于需要对单词进行排序,运行时间至少为O(n log(n)。为了保持单词的顺序,我使用Tree Map来...
单词计数器使用二进制搜索树创建了一个程序,该程序将读取文本文件,并创建一个在该文本文件中找到的所有单词的二进制搜索树,并对每个单词出现的次数进行计数。 还有一个停用词列表,例如“ a,the,and,or等”。 ...