데이터 베이스 MySQL 튜토리얼 找出多个文本中频率高的单词(2)

找出多个文本中频率高的单词(2)

Jun 07, 2016 pm 03:32 PM
단어 다수의 알아내다 텍스트 빈도 높은

接上篇,我打算用 用concurrent包里的CountDownLatch类 去实现。 还是直接上代码吧: Main.java package com.anders.thread;import java.util.HashMap;import java.util.Map;import java.util.concurrent.CountDownLatch;import java.util.concurrent.Execut

接上篇,我打算用用concurrent包里的CountDownLatch类去实现。


还是直接上代码吧:

Main.java

package com.anders.thread;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

	public static void main(String[] args) {

		int threadNumber = Integer.parseInt(PropertiesUtil.get("ThreadNumber"));

		ExecutorService es = Executors.newFixedThreadPool(threadNumber);
		SingleThreadStatistics[] threads = new SingleThreadStatistics[threadNumber];
		try {
			CountDownLatch doneSignals = new CountDownLatch(threadNumber);

			// 这是在 文件数比线程数多的情况下,若文件比线程数少的话,加个判断就可以了
			for (int i = 0; i  map = mergeThreadMap(threads);

			display(map);

		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			es.shutdown();
		}

	}

	private static Map<string integer> mergeThreadMap(SingleThreadStatistics[] threads) {
		Map<string integer> map = new HashMap<string integer>();

		for (SingleThreadStatistics singleThreadStatistics : threads) {
			Map<string integer> threadMap = singleThreadStatistics.getMap();

			for (Map.Entry<string integer> entry : threadMap.entrySet()) {
				String threadWord = entry.getKey();
				Integer threadWordCount = entry.getValue();
				Integer wordCount = map.get(threadWord);

				if (wordCount == null) {
					map.put(threadWord, threadWordCount);
				} else {
					map.put(threadWord, threadWordCount + wordCount);
				}
			}
		}

		return map;
	}

	private static void display(Map<string integer> map) {

		for (Map.Entry<string integer> entry : map.entrySet()) {
			System.out.print(entry.getKey());
			System.out.println("   ," + entry.getValue());
		}

	}

}
</string></string></string></string></string></string></string>
로그인 후 복사

SingleThreadStatistics.java
package com.anders.thread;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

public class SingleThreadStatistics implements Runnable {

	private Map<string integer> map = new HashMap<string integer>();
	private CountDownLatch doneSignals;

	public SingleThreadStatistics(CountDownLatch doneSignals) {
		this.doneSignals = doneSignals;
	}

	@Override
	public void run() {

		while (true) {
			File file = FileManager.getFile();
			if (file == null) {
				break;
			}
			FileManager.parseFile(file, map);
		}

		doneSignals.countDown();

	}

	// --------getter/setter------------

	public Map<string integer> getMap() {
		return map;
	}

}
</string></string></string>
로그인 후 복사

FileManager.java
package com.anders.thread;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Manage files and offer single for every thread
 * 
 * @author Anders
 * 
 */
public class FileManager {

	private static List<file> fileList;
	private static int index = 0;

	static {
		String dirPath = PropertiesUtil.get("DirName");
		String path = FileManager.class.getClassLoader().getResource(dirPath).getPath();
		fileList = getFiles(path);
	}

	public synchronized static File getFile() {
		if (index == fileList.size()) {
			return null;
		}
		File file = fileList.get(index);
		index++;
		return file;
	}

	private static List<file> getFiles(String dirPath) {

		File dir = new File(dirPath);
		if (!dir.exists() || !dir.isDirectory()) {
			return Collections.emptyList();
		}

		File[] files = dir.listFiles();

		//判断 是不是  以txt结尾的文件
		Pattern pattern = Pattern.compile(PropertiesUtil.get("FileType"));
		List<file> list = new ArrayList<file>();

		for (File file : files) {
			Matcher matcher = pattern.matcher(file.getName());
			if (matcher.matches()) {
				list.add(file);
			}
		}

		return list;
	}

	//读取文件  使用的是java.nio的filechannel 和bytebuffer
	public static void parseFile(File file, Map<string integer> map) {
		FileInputStream ins = null;
		try {
			ins = new FileInputStream(file);
			FileChannel fIns = ins.getChannel();
			ByteBuffer buffer = ByteBuffer.allocate(1024);

			while (true) {
				buffer.clear();
				int r = fIns.read(buffer);
				if (r == -1) {
					break;
				}
				buffer.flip();
				buffer2word(buffer, map);
			}
			fIns.close();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (ins != null) {
					ins.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	//这个是  将读取的内容,提取出  英语字母
	private static void buffer2word(ByteBuffer buffer, Map<string integer> map) {
		StringBuilder str = new StringBuilder();
		for (int i = 0; i  map) {
		Integer count = map.get(word);
		if (null == count) {
			map.put(word, 1);
		} else {
			map.put(word, ++count);
		}
	}

	//看看是否是  英语字符
	private static boolean isEnglishChar(byte b) {
		//通过ASCLL码  判断
		if (b > 65 && b  97 && b <br>

<p><br>
</p>
config.properties<br>


<pre class="brush:php;toolbar:false">ThreadNumber=3
DirName=txt
FileType=.*.txt
로그인 후 복사


其实我觉得最重要的代码是  FileManager里的

public synchronized static File getFile() {
		if (index == fileList.size()) {
			return null;
		}
		File file = fileList.get(index);
		index++;
		return file;
	}
로그인 후 복사
这部分代码,因为只要  每个thread 分别得到不同的文件,就可以了。

而且还有一个很重要的一点就是  验证index是否已经读取完所有的文件  要和index++放在一个同步块里面,不然会引起线程安全问题


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

성능, 메모리 빈도 또는 타이밍에 더 큰 영향을 미치는 것은 무엇입니까? 성능, 메모리 빈도 또는 타이밍에 더 큰 영향을 미치는 것은 무엇입니까? Feb 19, 2024 am 08:58 AM

메모리는 컴퓨터에서 가장 중요한 구성 요소 중 하나이며 컴퓨터의 성능과 안정성에 큰 영향을 미칩니다. 메모리를 선택할 때 사람들은 타이밍과 빈도라는 두 가지 중요한 매개변수에 초점을 맞추는 경향이 있습니다. 그렇다면 메모리 성능에 있어 타이밍과 빈도 중 어느 것이 더 중요한가요? 먼저 타이밍(Timing)과 주파수(Frequency)의 개념을 이해해보자. 타이밍이란 메모리 칩이 데이터를 수신하고 처리하는 데 필요한 시간 간격을 의미합니다. 일반적으로 CL 값(CASLatency)으로 표시됩니다. CL 값이 작을수록 메모리 처리 속도가 빨라집니다. 주파수는 이내

새로운 벨소리 및 문자음 사용해 보기: iOS 17의 iPhone에서 최신 소리 알림을 경험해 보세요 새로운 벨소리 및 문자음 사용해 보기: iOS 17의 iPhone에서 최신 소리 알림을 경험해 보세요 Oct 12, 2023 pm 11:41 PM

iOS 17에서 Apple은 전화, 문자 메시지, 알람 등에 사용할 수 있는 20개 이상의 새로운 사운드를 제공하여 전체 벨소리 및 텍스트 톤 선택을 철저히 조사했습니다. 이를 보는 방법은 다음과 같습니다. 많은 새로운 벨소리는 기존 벨소리보다 더 길고 현대적으로 들립니다. 여기에는 아르페지오, 깨진, 캐노피, 캐빈, 삐걱거리는 소리, 새벽, 출발, 돌롭, 여행, 주전자, 수은, 은하계, 쿼드, 방사형, 청소부, 묘목, 쉼터, 뿌리기, 계단, 이야기 시간, 놀림, 기울이기, 펼치기 및 계곡이 포함됩니다. . 반사는 기본 벨소리 옵션으로 유지됩니다. 수신 문자 메시지, 음성 메일, 수신 메일 알림, 미리 알림 등에 사용할 수 있는 10개 이상의 새로운 문자 신호음도 있습니다. 새로운 벨소리 및 문자 알림음에 액세스하려면 먼저 iPhone이

Chrome 및 Edge의 모든 탭에서 텍스트를 검색하는 방법 Chrome 및 Edge의 모든 탭에서 텍스트를 검색하는 방법 Feb 19, 2024 am 11:30 AM

이 튜토리얼에서는 Windows의 Chrome 또는 Edge에서 열려 있는 모든 탭에서 특정 텍스트나 문구를 찾는 방법을 보여줍니다. Chrome에 열려 있는 모든 탭에서 텍스트 검색을 수행하는 방법이 있습니까? 예, Chrome의 무료 외부 웹 확장 프로그램을 사용하면 수동으로 탭을 전환하지 않고도 열려 있는 모든 탭에서 텍스트 검색을 수행할 수 있습니다. TabSearch 및 Ctrl-FPlus와 같은 일부 확장 기능을 사용하면 이를 쉽게 달성할 수 있습니다. Chrome의 모든 탭에서 텍스트를 검색하는 방법은 무엇입니까? Ctrl-FPlus는 사용자가 브라우저 창의 모든 탭에서 특정 단어, 문구 또는 텍스트를 쉽게 검색할 수 있게 해주는 무료 확장 프로그램입니다. 이번 확장

대형 모델을 사용하여 텍스트 요약 교육을 위한 새로운 패러다임 만들기 대형 모델을 사용하여 텍스트 요약 교육을 위한 새로운 패러다임 만들기 Jun 10, 2023 am 09:43 AM

1. 텍스트 작업 이 기사에서는 생성적 텍스트 요약 방법과 대조 학습 및 대규모 모델을 사용하여 최신 생성적 텍스트 요약 훈련 패러다임을 구현하는 방법을 주로 논의합니다. 여기에는 주로 두 개의 기사가 포함됩니다. 하나는 대조 학습을 사용하여 생성 모델에 순위 지정 작업을 도입하는 BRIO: Bringing Order to Abstractive Summarization(2022)이고, 다른 하나는 참조로 대규모 언어 모델을 요약하는 OnLearning(2023)입니다. BRIO를 기반으로 고품질 훈련 데이터를 생성하기 위한 대형 모델을 도입합니다. 2. 생성적 텍스트 요약 훈련 방법 및

win7 시스템에서 txt 텍스트를 열 수 없는 경우 수행할 작업 win7 시스템에서 txt 텍스트를 열 수 없는 경우 수행할 작업 Jul 06, 2023 pm 04:45 PM

win7 시스템이 txt 텍스트를 열 수 없으면 어떻게 해야 합니까? 컴퓨터에서 텍스트 파일을 편집해야 할 때 가장 쉬운 방법은 텍스트 도구를 사용하는 것입니다. 그러나 일부 사용자는 자신의 컴퓨터가 txt 텍스트 파일을 열 수 없다는 사실을 발견합니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까? win7 시스템에서 txt 텍스트를 열 수 없는 문제를 해결하기 위해 자세한 튜토리얼을 살펴보겠습니다. win7 시스템에서 txt 텍스트를 열 수 없는 문제를 해결하기 위한 튜토리얼 1. 바탕 화면에서 txt 파일을 마우스 오른쪽 버튼으로 클릭하세요. txt 파일이 없으면 마우스 오른쪽 버튼을 클릭하여 새 텍스트 문서를 만든 다음 속성을 선택하세요. 2. 열린 txt 속성 창에서 아래 그림과 같이 일반 옵션 아래의 변경 버튼을 찾습니다. 3. 팝업 열기 모드 설정에서

한 달 동안 온라인 채팅을 한 끝에 돼지 죽이는 사기꾼은 실제로 AI에게 패배했습니다! 200만 네티즌, 충격에 소리쳤다 한 달 동안 온라인 채팅을 한 끝에 돼지 죽이는 사기꾼은 실제로 AI에게 패배했습니다! 200만 네티즌, 충격에 소리쳤다 Apr 12, 2023 am 09:40 AM

'돼지 킬링 플레이트'라고하면 모두가 가려워서 싫어할 것입니다. 이러한 유형의 온라인 데이트 및 결혼 사기에서 사기꾼은 유혹에 빠지기 쉬운 피해자를 미리 찾고 있으며, 그들은 종종 사랑에 대한 아름다운 환상을 가진 순진하고 친절하며 예의바른 소녀입니다. 이 사기꾼들과 500 라운드 동안 싸우기 위해 스테이션 B의 기술계에서 잘 알려진 "튜링의 고양이"는 채팅할 때 자주 재미있는 농담을 하고 실제보다 훨씬 뛰어난 AI를 훈련시켰습니다. 사람. 그 결과, 사기꾼은 AI의 작동으로 이 가짜 여성에 혼란을 느끼고 520을 '그녀'에게 직접 전송했습니다. 더 웃긴 것은 사기꾼이 자신을 이용할 기회가 전혀 없다는 사실을 알게 된 후 결국 방어를 무너뜨렸을 뿐만 아니라 AI로부터 '유명한 인용문'도 받았다는 것입니다. 영상이 나오자 곧바로 입소문이 났고, B 스테이션에서 서핑하던 친구들은 모두 속았다.

몰입형 리더와 함께 Microsoft Reader Coach를 사용하는 방법 몰입형 리더와 함께 Microsoft Reader Coach를 사용하는 방법 Mar 09, 2024 am 09:34 AM

이 기사에서는 Windows PC의 몰입형 리더에서 Microsoft Reading Coach를 사용하는 방법을 보여줍니다. 읽기 지도 기능은 학생이나 개인이 읽기를 연습하고 읽고 쓰는 능력을 개발하는 데 도움이 됩니다. 지원되는 애플리케이션에서 구절이나 문서를 읽는 것부터 시작하고, 이를 기반으로 Reading Coach 도구를 통해 읽기 보고서가 생성됩니다. 읽기 보고서에는 읽기 정확도, 읽는 데 걸린 시간, 분당 올바른 단어 수, 읽으면서 가장 어려웠던 단어가 표시됩니다. 또한 단어를 연습할 수 있어 전반적인 읽기 능력을 개발하는 데 도움이 됩니다. 현재 Office 또는 Microsoft365(웹용 OneNote 및 We용 Word 포함)만

ASUS TUF Z790 Plus는 ASUS MCP79 메모리 주파수와 호환됩니다. ASUS TUF Z790 Plus는 ASUS MCP79 메모리 주파수와 호환됩니다. Jan 03, 2024 pm 04:18 PM

ASUS tufz790plus는 메모리 주파수를 지원합니다. ASUS TUFZ790-PLUS 마더보드는 듀얼 채널 DDR4 메모리를 지원하고 최대 64GB의 메모리를 지원하는 고성능 마더보드입니다. 메모리 주파수는 최대 4800MHz로 매우 강력합니다. 지원되는 특정 메모리 주파수에는 2133MHz, 2400MHz, 2666MHz, 2800MHz, 3000MHz, 3200MHz, 3600MHz, 3733MHz, 3866MHz, 4000MHz, 4133MHz, 4266MHz, 4400MHz, 4533MHz, 4600MHz, 4733MHz 및 . 일상적인 사용이든 고성능 요구이든

See all articles