找出多个文本中频率高的单词(2)
接上篇,我打算用 用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; }
而且还有一个很重要的一点就是 验证index是否已经读取完所有的文件 要和index++放在一个同步块里面,不然会引起线程安全问题

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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