gpt4 book ai didi

java - 从我的队列中取出作为数字的字符串并将它们加在一起,以便可以打印出结果

转载 作者:行者123 更新时间:2023-12-01 15:38:37 25 4
gpt4 key购买 nike

我有一个项目,我必须制作一个字计数器..我已经制作了它并且工作正常。

然后我需要创建一个队列,以便获得文本的不同长度并将它们添加在一起并打印出来。

我创建了一个队列,并尝试将其打印出来,它还打印出文本中单词的数量,并且可以看到它将数字添加到队列中。

但是我不知道如何将这些数字从队列中取出,以便将它们加在一起

这是我的 WordCounterTester

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;


public class WordCountTest {

public static void main(String[] args){
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
for(int i = 0; i< args.length; i++){
Runnable r = new WordCount(args[i],queue);
Thread t = new Thread(r);
t.start();
}

}

}

还有我的字计数器

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.concurrent.BlockingQueue;

class WordCount implements Runnable {

public int result;
private String s;
Thread runner;
private BlockingQueue<String> queue;

public WordCount(String s, BlockingQueue<String> queue){
this.s = s;
this.queue = queue;
}

public void run() {
try{
FileReader fr = new FileReader(s);
Scanner scanner = new Scanner(fr);
for(int i = 0; true; i++){
result = i;
scanner.next();
}
}catch(FileNotFoundException e){
System.out.println("Du har skrevet en fil der ikke findes, den fil vil blive skrevet ud med 0 ord");
}
catch(NoSuchElementException e){}
System.out.println(s + ": " + result);
Integer.toString(result);
queue.add(result + "");
System.out.println(queue);
}

}

当我用 6 个不同的 .txt 运行程序时,我现在得到的结果是,顺序可能不同,因为它是多线程,所以不同,哪个先完成:)

5.txt: 1
[1]
6.txt: 90
[1, 90]
4.txt: 576
[1, 90, 576]
3.txt: 7462
[1, 90, 576, 7462]
1.txt: 7085
[1, 90, 576, 7462, 7085]
2.txt: 11489
[1, 90, 576, 7462, 7085, 11489]

有人知道我如何才能做到这一点吗?

最佳答案

我认为您缺少的是 main 需要在每个线程将其每个文件计数添加到队列后与它生成的线程连接。

public static void main(String[] args){
final BlockingQueue<Integer> queue = new LinkedBlockingQueue<String>();
Thread[] threads = new Thread[args.length];
for (int i = 0; i< args.length; i++){
Runnable r = new WordCount(args[i], queue);
threads[i] = new Thread(r);
threads[i].start();
}

// wait for the threads to finish
for (Thread t : threads) {
t.join();
}

int total = 0;
for (Integer value : queue) {
total += value;
}
System.out.println(total);
}

在此处的代码中,我实现了 @Ben van Gompel 的建议,即向队列添加一个 Integer 而不是 String

您还可以使用 AtomicInteger 类并执行以下操作:

final AtomicInteger total = new AtomicInteger(0);
...
Runnable r = new WordCount(args[i], total);
...
// join loop
// no need to total it up since each thread would be adding to the total directly
System.out.println(total);

在 WordCount 代码中,您可以使用 AtomicInteger,例如:

System.out.println(s + ": " + result);
// add the per-file count to the total
total.incrementAndGet(result);
// end

关于java - 从我的队列中取出作为数字的字符串并将它们加在一起,以便可以打印出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8447361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com