2015-04-07 5 views
0

У меня есть словарь терминов dictonery/AB.txt и большой текстовый файл dictonery/annotate.txt.возврат определенных значений из hashmap

Я хочу знать, какие словарные термины в AB.txt находятся в файле annotate.txt.

Вот мой код до сих пор:

String fileString = new String(Files.readAllBytes(Paths.get("dictonery/AB.txt")), StandardCharsets.UTF_8); 

Map<String, String> map = new HashMap<String, String>(); 

String entireFileText = new Scanner(new File("dictonery/annotate.txt")).useDelimiter("\\A").next(); 

map.put(fileString, "m"); 

for (String key : map.keySet()) { 
    if(fileString.contains(key)) { 
     System.out.print(key); 
    } 
} 

На данный момент вся dictionery возвращается. Как я могу получить конкретные условия в файле annotator.txt?

+0

'Scanner.next' метод принимает регулярные выражения, вы пробовали это? –

+2

Вы просто добавляете весь файл на карту. Вам нужно разбить его и добавить. Почему же карта? карту чего к чему? Вы просто пытаетесь получить список всех уникальных слов в файле? или вы пытаетесь сопоставить слова с описаниями? –

ответ

1

Там несколько вещей, которые могли бы помочь:

  • Поскольку вам не нужны значения в вашем Map, я бы использовать Set (в частности HashSet).
  • Используйте Scanner.next() читать отдельные слова, а не весь файл сразу
  • Ваш чек на fileString.contains(key) довольно неэффективно, и она также будет возвращать true для частичного совпадения (если ваш словарь содержит слово «делать», он также будет матч «собака»). Он также будет печатать соответствующие слова несколько раз.

Лично я бы создал два набора, прочитал оба файла таким же образом, а затем calculate their intersection. Если вы хотите отсортировать вывод (вероятно, не обязательно, но в целом приятно), вы можете сделать Set, чтобы вы перебирали TreeSet.

0

Вам не нужна карта.

  1. Читайте в вашем annotate.txt в качестве fileString
  2. Читайте в файле AB.txt с помощью цикла, как это:

    File file = new File("data.txt"); 
    
    try { 
        Scanner scanner = new Scanner(file); 
        while (scanner.hasNextLine()) { 
         String line = scanner.nextLine(); 
         // do something like fileString.contains(line) here 
        } 
    } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
    } 
    
  3. В то время цикла, проверьте, если fileString содержит line (который должен содержать токен, который он только что прочитал из вашего файла).

Это предполагает, что у вас есть один токен в строке.

+1

Зачем использовать 'nextLine()' (и принять конкретный формат ввода) вместо 'next()', который работает до тех пор, пока каждое слово разделено пробелами? Кроме того, зачем беспокоиться об исключении, если вы собираетесь распечатать трассировку стека? –

+0

@Brendon - Это всего лишь общий пример использования сканера. OP не предоставил образец файла AB.txt или файла annotate.txt, поэтому я стараюсь привести их в правильном направлении на основе информации, которую они предоставили. Основываясь на их файловом формате, они абсолютно могли кодировать его так, как вы заявляете. Я изначально собирался предоставить ссылку на учебник по сканеру, но решил, что я приведу вместо этого базовый пример. – Troy

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