`
chenzehe
  • 浏览: 538990 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java读取文件中单词进行排序并写到另一个文件中

 
阅读更多

支持 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;
		}
	}
}

 

 

 

 

0
0
分享到:
评论

相关推荐

    从键盘读取数字并排序,对文本中的单词进行排序,java

    在Java编程语言中,"从键盘读取数字并排序"是一项基本操作,这对于初学者来说是重要的学习内容。本文将详细讲解如何实现这个功能,并结合描述中的关键词,探讨相关知识点。 首先,我们要了解如何从键盘读取数字。在...

    将文本文件a.txt中的单词排序后写入b.txt

    有文本文件a.txt,每行一个英文单词。编制Java程序,读取该文件中的所有单词,然后按照单词长度降序排列;对于长度相等的单词,按照字典顺序降序排列。最后将排序后的单词按每个一行写入另一个文件b.txt。

    从键盘敲入一系列字母,将其存储到文件中,

    本篇文章将基于一个具体的Java程序案例来解析如何从键盘输入一系列字母、将其存储到文件中、对这些字母进行升序排序后存储到另一个文件中,并最终在屏幕上显示出来。我们将从以下几个方面进行深入探讨: 1. **从...

    单词统计排序输出(java的GUI实现)

    【标题】:“单词统计排序输出(java的GUI实现)”是一个使用Java编程语言设计的图形用户界面(GUI)应用程序,其主要功能是处理英文文本,统计其中的单词数量,并按字母顺序排列显示每个单词的出现次数。...

    基于管道过滤器风格的单词排序程序

    在本项目中,我们将探讨如何使用Java实现一个基于这种风格的单词排序程序。 首先,我们需要理解“管道过滤器”(Pipeline Filter)的概念。在软件工程中,这种模式通常用于处理大量数据,例如文本处理、音频视频...

    DisorderOfWord_Javaword单词重新排序_

    这是一个关于如何使用Java处理和重新排序单词的项目,可能用于教育目的,比如帮助用户以不同的方式学习英语单词,或者在其他场景下实现文本数据的随机化。 1. **Java编程基础**: Java是一种多平台、面向对象的...

    单词簿管理系统-Java课设作业

    【单词簿管理系统-Java课设作业】是一份Java课程设计报告,旨在实现一个用于管理单词簿的应用程序。这个系统能够帮助用户存储、检索和管理他们的词汇学习资料,为语言学习者提供便利。以下是对该系统的主要设计和...

    读取txt文件 并排序 附性能测试

    通过分析这个文件,我们可以了解到具体是如何实现读取、处理和排序txt文件的,以及性能测试是如何嵌入到代码中的。 总的来说,理解和优化这个过程涉及到了Android文件I/O、文本处理、数据结构(如HashMap)、排序...

    java 分析英文文章,并统计每个字母出现的次数

    在Java编程语言中,分析英文文章并统计每个字母出现的次数是一项常见的文本处理任务,它涉及到字符串操作、字符计数和文件I/O等基础知识。以下是一个详细的步骤介绍和相关知识点讲解: 1. **读取文本文件**:首先,...

    JAVA实现的单词统计、绘制图表程序

    在这个特定的项目中,"JAVA实现的单词统计、绘制图表程序"是一个利用Java编写的工具,它的主要功能是分析文本文件中的单词频率,并通过图表展示这些数据。这个程序对于文本挖掘、语言学研究或者教育场景都非常实用。...

    Java语言开发相关单词

    虽然“简单的”并不是Java语言中的一个关键词或术语,但在编程中经常会提及“简单性”,这指的是代码的可读性和易于理解性。 ### 默认:`default` `default`是Java中的一个访问修饰符,表示默认的访问级别。如果...

    背单词_java_src.rar_JAVA 背单词_单词软件_背单词

    标题中的“背单词_java_src.rar”表明这是一个与Java编程相关的项目,主要目的是为了开发或实现一个帮助用户记忆单词的应用程序。关键词“JAVA 背单词”揭示了这个项目的核心功能,即利用Java语言来创建一个背单词的...

    查找英文文章中有多少不同的单词以及单词出现的频数

    遍历处理后的单词数组,每次遇到一个单词,如果不在字典中,添加到字典并设置计数为1;如果已经在字典中,将其计数加1。 ```java Map, Integer&gt; wordCountMap = new HashMap(); for (String word : words) { if (!...

    统计一篇文档中每个单词出现的次数,频率

    在IT领域,文本分析是一项重要的任务...总之,统计文档中每个单词的出现次数是文本分析的基础,通过Java编程可以实现这一功能,结合合适的分词工具和数据结构,我们可以有效地完成词频统计,并根据需求进行排序和输出。

    java必记单词

    - **定义**:在继承关系中,继承另一个类的类称为子类。 - **应用场景**:用于添加新的功能或修改现有功能。 #### Class 类 - **定义**:类是具有相似属性和行为的对象的模板。 - **应用场景**:用于定义对象的结构...

    ai.rar_ai_java ai_单词本java

    标题中的"ai.rar_ai_java ai_单词本java"暗示了一个基于Java编程语言的AI项目,主要涉及英文单词的识别。这个项目可能是一个智能单词学习应用,利用人工智能技术帮助用户识别和记忆英语单词。 描述中提到“本程序...

    Java词频统计程序MVC

    在词频统计程序中,Model层可能包含一个或多个类,用于读取文本文件,分割文本成单词,然后统计每个单词出现的次数。这个过程可能涉及到字符串处理、集合操作以及数据结构,如哈希表或树,以便高效地存储和查询单词...

    JAVA常用英语单词

    在Java编程语言中,了解和掌握一些常用的英语单词是非常重要的,因为它们构成了编程的基本概念和关键字。以下是一些关键的Java编程词汇及其解释: 1. **构造方法** (Constructor):构造方法是一个特殊的方法,用于...

    Java词频统计算法(使用单词树)

    - 如果不在,创建一个新的孩子节点并连接到当前节点。 - 如果在,则继续遍历到下一个字符。 - 在遍历结束时,更新当前节点的计数器。 2. **遍历单词树获取词频**: - 使用深度优先搜索遍历整个单词树。 - 对于...

Global site tag (gtag.js) - Google Analytics