2013-08-06 5 views
0

Так что я пытался заставить это работать некоторое время. Позвольте мне изложить это, сказав, что я не программист. Это скорее хобби, которое я недавно занял. Я пытался получить 2 текстовых файла, чтобы искать друг друга по строкам. т. е. у вас есть куча слов (около 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

Если вы загрузите все слова первого файла в массив, все, что вам нужно сделать, это прочитать из второго файла и сравнить его с содержимым массива. Количество слов достаточно мало, что не займет много памяти, и вы имеете дело только с одним файлом. –

+0

Заметьте, используя оболочку: 'fgrep -f sample2.txt sample3.txt' –

ответ

0

вопрос вы работаете через что вы используете сканер внутри сканера. Способ, которым вы в настоящее время располагаете ваши сканеры, заставляет один сканер полностью читать весь текстовый файл для первого слова, но после этого он пропустил весь файл и никогда не вернет значение true для scan2.hasNextLine().

Лучший способ достичь того, что вы хотите, - это то, что заявила remyabel. Вы должны создать массив, который будет содержать все слова из вашего небольшого файла, которые будут повторяться каждый раз, когда вы будете проходить через слово в другом файле. Вам также необходимо создать что-то, чтобы отслеживать, сколько раз каждое слово попало, чтобы вы могли использовать что-то вроде хэш-карты.

Это будет выглядеть по линии этого:

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

Смежные вопросы