2013-08-06 147 views
0

所以我一直在試圖讓這個工作一段時間。讓我先說這個,說我不是程序員。最近我接受了這更多的愛好。我一直試圖讓2個文本文件逐行搜索。即One有一串單詞(大約10個,每行一個),另一個單詞也有多個(接近500個)。我希望我的程序能夠說出較小文本文件中的每個單詞在較大文本文件中出現的次數。我到目前爲止是:使用一個文本文件來搜索另一個文本文件

import java.util.Scanner; 
    import java.io.File; 
    import java.util.regex.Pattern; 

    public class StringSearch 
    { 

    public static void main (String args[]) throws java.io.IOException 
     { 
    int tot = 0; 
    Scanner scan = null; 
    Scanner scan2 = null; 
    String str = null; 
    String str2 = null; 


    File file = new File("C:\\sample2.txt"); 
    File file2 = new File("C:\\sample3.txt"); 
    scan = new Scanner(file); 
    scan2 = new Scanner(file2); 
     while (scan.hasNextLine()) 
     { 
     str = scan.nextLine(); 
     tot = 0; 
      while (scan2.hasNextLine()) 
      { 
       str2 = scan2.nextLine(); 
        if(str.equals(str2)) 
        { 
       tot++; 
        } 
      } 
    System.out.println("The String = " + str + " and it occurred " + tot + " times"); 
     } 

    } 
    } 

不知道爲什麼這不工作。它讀取第一個文本文件中的第一個單詞,並計算它在第二個文本文件中出現的次數,但是它只是停止並且不移動第一個文件中的第二個單詞。我希望這是有道理的。我認爲第二個循環有些問題,但我不知道是什麼。

所以,任何幫助將不勝感激。我希望能夠在未來發揮作用並轉向更復雜的項目。要開始正確的地方?

乾杯傢伙

+0

如果將第一個文件的所有單詞加載到數組中,則只需從第二個文件中讀取數據,並將其與數組內容進行比較。單詞的數量足夠小,不會佔用太多內存,而且您只處理一個文件。 – 2013-08-06 12:50:53

+0

注意,使用shell:'fgrep -f sample2.txt sample3.txt' –

回答

0

要跨運行的問題是,您使用的掃描儀中的掃描儀。您目前將掃描儀嵌套的方式會導致一臺掃描儀完整讀取第一個單詞的整個文本文件,但在第一次掃描之後,它已經讀取整個文件,並且永遠不會爲scan2.hasNextLine()返回true。

一個更好的方式來實現你想要的是雷米貝爾所說的。您應該創建一個數組,其中包含您的小文件中的所有單詞,每次通過其他文件中的單詞時都會迭代該單詞。您還需要創建一些內容來跟蹤每個單詞被擊中的次數,以便您可以使用類似hashmap的內容。

看起來會沿此線:

Scanner scan = null; 
Scanner scan2 = null; 
String str = null; 
String str2 = null; 


File file = new File("C:\\sample2.txt"); 
File file2 = new File("C:\\sample3.txt"); 
scan = new Scanner(file); 
scan2 = new Scanner(file2); 
//Will contain all of your words to check against 
ArrayList<String> dictionary = new ArrayList<String>(); 
//Contains the number of times each word is hit 
HashMap<String,Integer> hits = new HashMap<String, Integer>(); 
while(scan.hasNextLine()) 
{ 
    str = scan.nextLine(); 
    dictionary.add(str); 
    hits.put(str, 0); 
} 
    while (scan2.hasNextLine()) 
     { 
      str2 = scan2.nextLine(); 
      for(String str: dictionary) 
      { 
       if(str.equals(str2)) 
       { 
        hits.put(str, hits.get(str) + 1); 
       } 
      } 
     } 
    for(String str: dictionary) 
    { 
     System.out.println("The String = " + str + " and it occurred " + hits.get(str) + " times"); 
    } 
} 
0

創建一個緩衝的讀取器和文件讀入到地圖的<String, Integer>一個:

String filename = args[0]; 
BufferedReader words = new BufferedReader(new FileReader(FILENAME)); 
Map<String, Integer>m = new HashMap<String, Integer>(); 
for(String word: words.readLine()){ 
    if(word!=null && word.trim().length()>0) { 
     m.add(String, 0); 
    } 
} 

然後讀取單詞列表並增加每次找到地圖的值:

String filename = args[1]; 
BufferedReader listOfWords = new BufferedReader(new FileReader(FILENAME2)); 
for(String word: listOfWords.readLine()){ 
    if(word!=null && word.trim().length()>0) { 
     if(m.get(word)!=null){ 
      m.add(word, m.get(word) + 1); 
     } 
    } 
}  

然後打印結果:

for(String word: map.keys()){ 
    if(map.get(word)>0){ 
     System.out.println("The String = " + word + " occurred " + map.get(word) + " times"); 
    } 
} 
0

您使用嵌套循環的方法會掃描第一個文件中每個單詞的第二個文件。這將是非常低效的。我建議加載第一個文件在HashMap

這不僅可以利用快速查找,還可以輕鬆更新發生次數。更不用說,您只需掃描一次第二個文件,而第一個文件中的任何重複項都會自動忽略(因爲結果會相同)。

Map<String, Integer> wordCounts = new HashMap<String, Integer>(); 

Scanner scanner = new Scanner("one\nfive\nten"); 
while (scanner.hasNextLine()) { 
    wordCounts.put(scanner.nextLine(), 0); 
} 
scanner.close(); 

scanner = new Scanner("one\n" + // 1 time 
         "two\nthree\nfour\n" + 
         "five\nfive\n" + // 2 times 
         "six\nseven\neight\nnine\n" + 
         "ten\nten\nten"); // 3 times 

while (scanner.hasNextLine()) { 
    String word = scanner.nextLine(); 
    Integer integer = wordCounts.get(word); 
    if (integer != null) { 
     wordCounts.put(word, ++integer); 
    } 
} 
scanner.close(); 

for (String word : wordCounts.keySet()) { 
    int count = wordCounts.get(word); 
    if (count > 0) { 
     System.out.println("'" + word + "' occurs " + count + " times."); 
    } 
} 

輸出

'ten' occurs 3 times. 
'five' occurs 2 times. 
'one' occurs 1 times. 
0

它只是一個簡單的邏輯問題..

添加以下語句下面的System.out.println

SCAN2 =新的掃描儀(文件2);

+0

這是如何解決OP的問題? – UditS

相關問題