Java循环和递增问题

3

有谁能告诉我我的程序存在什么问题吗?

String a[],b[];
int c[] = new int[b.length];

for (int j = 0; j < a.length; j++) {
    for (int k = 0; k < b.length; k++) {
        if (b[k].equals(a[j])) {
            c[k]++;
        } else {
            c[k] = 0;
        }
    }
}

我有成千上万个单词存储在一个HashMap中。现在我想检查每个文件中从allWords出现了多少次一个单词。

你能指出我的程序中的错误或给我你的想法,我该如何做吗?


你当前的实现中出现了哪些错误?我目前看到的一个可能的错误是你从未初始化oneFileWordsallWords - David Weiser
2个回答

3
我认为这行代码不必要地重置了计数器:
newData[j] = 0;

尝试将其移除:
for (int j = 0; j < oneFileWords.length; j++) {
    for (int k = 0; k < allWords.length; k++) {
        if (allWords[k].equals(oneFileWords[j])) {
            newData[j]++;
        }
    }
}

如果你想为每个文件中的每个单词都保留一个单独的计数,则需要使用二维数组。
int newData[][] = new int[oneFileWords.length][allWords.length];

你可以使用newData[j][k]来访问它。

这不会影响性能吗?我之前用过二维数组,但是无法递增它,于是我使用了另一个循环来进行求和,结果导致程序速度非常慢。 - user552961
@user552961:二维数组本身并不慢。我想可能是你使用的方式导致了它变慢。我不知道为什么你认为需要额外的循环 - 只需将 newdata[j] 更改为 newdata[j, k] 即可。 - Mark Byers
2
@Mark Byers:newData[j, k] ?我不知道Java中访问二维数组的这种方式(我在用Java 5)。您是指*newData[][]new int[oneFileWords.length][allWords.length],然后使用newData[j][k]而不是newData[j,k]*进行访问吗? 我不是很确定,所以我不敢自己编辑您的答案。 - SyntaxT3rr0r
@SpoonBender,你能把你的解决方案也给我吗?谢谢。 - user552961
1
@Mark Byers,当您打印二维数组时,它将不会给您与我在问题中请求的相同输出。它只会产生例如0 1 0 0 0 1 0 \n 0 0 0 1 0 0 1 \n 1 0 1 0 1 0 0,然后我必须使用另一个循环来总结所有这些值以获取一个文件计算的单词数。 - user552961
显示剩余3条评论

0
你可以在读取文件时计算单词并将其存储在Map中。假设文件中的最后一个单词是“-1”,每行只有一个单词,即使这个单词是“happy birthday”,我会像这样处理:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class StackOverflow {

@SuppressWarnings("unchecked")
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Map<String, Integer> countedWords = new HashMap<String, Integer>();
    int numberOfWords = 0;
    String word = "";
    while (true) {
        word = scanner.nextLine();
        if (word.equalsIgnoreCase("-1")) {
            break;
        }
        if (countedWords.containsKey(word)) {
            numberOfWords = countedWords.get(word);
            countedWords.put(word, ++numberOfWords);
        } else {
            countedWords.put(word, 1);
        }
    }
    Iterator it = countedWords.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
    }
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接