所以我有一个涉及一致性的编程练习。我试图获取.txt文件,使用正则表达式将其解析为包含所有单词的字符串,然后创建一个具有键(单词)和值(单词出现在文档中的次数)的Hashtable。我们应该能够通过传入布尔值来解释区分大小写和非区分大小写的情况。
这就是我所拥有的:
public Concordance( String pathName, boolean is_case_sensitive ) {
Scanner file = new Scanner(pathName);
try {
file = new Scanner(new File(pathName));
} catch (FileNotFoundException e) {
System.out.println("No File Found");
}
String[] words;
Pattern pattern = Pattern.compile("\\W+");
words = pattern.split(file.nextLine());
String[] wordsCopy = new String[words.length];
for (int i = 0; i < words.length; i++){
wordsCopy[i] = new String(words[i]);
}
int counter = 0;
while (file.hasNext()){
for (String w : words){
counter = 0;
for (String w2 : wordsCopy){
if (is_case_sensitive == false){
if (w.equalsIgnoreCase(w2)){
counter++;
//w2 = null;
tableOfWords.put(w, counter);
file.next();
}
}
if (is_case_sensitive == true){
if (w.equals(w2)){
counter++;
//w2 = null;
tableOfWords.put(w, counter);
file.next();
}
}
}
}
}
}
带你走过我所处的地方以及我相信的错误.......
我使用扫描仪来接收&#34;接收&#34;该文件使用正则表达式\ W +来获取所有单词。我创建一个String数组,我将Pattern模式拆分为String数组。然后我创建一个数组的深层副本,以便在比较期间使用。 (所以我现在有两个String数组 - words和wordsCopy)。我使用一个int计数器变量来跟踪它出现的次数,并通过使用if语句和equals / equalsIgnoreCase方法来解决区分大小写。我一直在来之间来回分配w2到null(它当前被注释掉),因为我直觉地觉得如果它没有被设置为null,它将被计算两次,但我似乎无法正确地思考它。我想我正在计算一式两份的项目,但似乎无法找到解决方案。任何见解?谢谢!
答案 0 :(得分:0)
您不需要任何额外的String []来检查区分大小写
Pattern pattern = Pattern.compile("\\W+");
HashMap<String, AtomicInteger> tableOfWords = new HashMap<String, AtomicInteger>();
while (file.hasNextLine()){
words = pattern.split(file.nextLine());
for (String w : words){
String tmp = w;
if (!is_case_sensitive){
tmp = String.valueOf(w.toLowerCase());
}
AtomicInteger count = tableOfWords.get(tmp);
if (count == null){
count = new AtomicInteger(0);
}
count.incrementAndGet();
tableOfWords.put(tmp,count);
}
}
如果不需要区分大小写,请将实际单词转换为低/高大小写。然后一切都很完美。
答案 1 :(得分:0)
据我所知,你实际上是多次计算单词(超过两次)
我会给你一个简单的foreach循环来解释你在做什么, 某些语法可能有误,因为我没有使用ide来编写此代码
int[5] ints = {1,2,3,4,5};
int[5] intcopy = ints;
for(int i:ints){
for(int j: intcopy){
system.out.println(j);
}
}
打印结束的是什么 1 2 3 4 五 1 2 3 4 五 1 2 3 4 五 1 2 3 4 五 1 2 3 4 五 1 2 3 4 5
所以不要计算5件你计算25件事的东西,希望这有帮助