Как загрузить текст из текстового файла и сравнить с другим текстовым файлом?

Я написал небольшую программу, которая считывает текст из файла и печатает обратную сторону каждого слова в текстовом файле.

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

Вот что я успел написать на данный момент

    String word;
    String[] reverse;
    int wordLength;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws FileNotFoundException {
    // TODO code application logic here

    Map<Integer, String> aMap2 = new HashMap<Integer, String>();
    String mString = "";
    int mInt = 0;
    String word;
    String[] reverse = new String[1];
    int wordLength;
    
    FileInputStream fileIn = new FileInputStream ("example.txt”);
    //text in the text file - "what he saw was not part of a trap just a ton of crazy snow"
    Scanner scan = new Scanner(fileIn);
    Scanner lineScanner;
    Scanner wordscanner = null;
    String aLine;
    String aWord;

    while(scan.hasNextLine()){
        aLine = scan.nextLine();
        lineScanner = new Scanner(aLine);
        lineScanner.useDelimiter(",");
        word = lineScanner.next();
        System.out.println(word);
        try{
            wordscanner = new Scanner(new File("example.txt"));
        } catch(FileNotFoundException x){
            x.printStackTrace();
        }

        while(wordscanner.hasNext()){
            Scanner newWord = new Scanner(wordscanner.next());
            boolean b;
            while(b = newWord.hasNext()){
                String foundWord = newWord.next();
                wordLength = foundWord.length();
                char ch = ' ';
                String reverseWord = “";

                for(int i = wordLength-1; i >= 0; i--){
                    ch = foundWord.charAt(i);
                    //System.out.println(ch);
                    reverseWord = reverseWord + ch;
                }
                
                for(int k = 0; k < reverse.length; k++){
                      reverse[k] = foundWord + ", " + reverseWord;
                      mString = reverse[k];
                      mInt = reverse[k].length();
                      aMap2.put(mInt, mString);
                }
            }
        }
    }
    Map<Integer, String> sorted = sortByKeys(aMap2);
    System.out.println(sorted);
}


public static <K extends Comparable,V extends Comparable> Map<K,V> sortByKeys(Map<K,V> map){
    List<K> keys = new LinkedList<K>(map.keySet());
    Collections.sort(keys);
  
    //LinkedHashMap will keep the keys in the order they are inserted
    //which is currently sorted on natural ordering
    Map<K,V> sortedMap = new LinkedHashMap<K,V>();
    for(K key: keys){
        sortedMap.put(key, map.get(key));
    }
  
    return sortedMap;
    
    // http://javarevisited.blogspot.co.uk/2012/12/how-to-sort-hashmap-java-by-key-and-value.html
}

Это дает мне следующий результат

то, что он увидел, было не частью ловушки, а просто тонной сумасшедшего снега.

{4=a, a, 6=of, fo, 8=ton, not, 10=снег, вон, 12=безумие, yzarc}

Теперь моя проблема заключается в том, как мне перепроверить обратную сторону слов (предпочтительно посимвольно) с текстовым файлом словаря, чтобы увидеть, составляют ли обратные слова значимые слова?

Я просмотрел здесь и увидел несколько предложений, но не смог найти ни одного, который помог бы мне понять, как решить мою текущую проблему.

Я думал об использовании двоичного дерева поиска. Моя идея заключалась в том, чтобы загрузить файл словаря в двоичное дерево и выполнить поиск в дереве, чтобы увидеть, составляют ли обратные слова существующие слова, а затем распечатать их. Но я не смог продолжить из-за того, что не понимаю, как получить строку из одного текстового файла, а затем сравнить ее со вторым текстовым файлом.

Наконец, не могли бы вы помочь мне указать правильное направление, чтобы слова отображались в 2D-массиве, пожалуйста?! Я пробовал это несколько раз, но это просто не работает, и у меня нет идей :( !

Заранее спасибо.


person Ange    schedule 20.07.2013    source источник
comment
Я не понимаю эту часть вашего вывода: 10 = снег, вон, 12 = сумасшедший, yzarc ‹-- я не вижу этого во входном тексте.   -  person fge    schedule 20.07.2013
comment
Кроме того, как вы справляетесь с палиндромами?   -  person fge    schedule 20.07.2013
comment
@fge это результат слов, которые находятся во входном текстовом файле с тем же словом, но в обратном порядке. Я не подумал об этом... :О! Спасибо, попробую написать метод для работы с палиндромами.   -  person Ange    schedule 20.07.2013


Ответы (1)


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

public Set<String> readFileIntoSet(String fileName) {
  Set<String> result = new HashSet<String>();
  for (Scanner sc = new Scanner(new File(fileName)); sc.hasNext(); ) 
    result.add(sc.nextLine());
  return result;
}

В вашем основном методе добавьте вызов readFileIntoSet:

Set<String> dictionary = readFileIntoSet("your_dictionary_file");

Затем, после того, как вы найдете перевернутое слово, проверьте, есть ли оно в словаре:

if (dictionary.contains(reverseWord))
   system.out.println("this word: " + reverseWord + " appears in the dictionary!");

Также обратите внимание, что класс String предлагает «обратный» метод. Таким образом, вы можете избавиться от цикла for(int i = wordLength-1; i >= 0; i--){ ... } и просто использовать reverseWord = foundWord.reverse();

person Itay Maman    schedule 20.07.2013
comment
Большое тебе спасибо. Не могли бы вы помочь мне понять, как здесь работает HashSet, из приведенного выше кода кажется, что он просто действует как временный карман, содержащий файл словаря во время работы программы, я прав?! - person Ange; 20.07.2013
comment
Ага. HashSet — это структура данных, которая может быстро ответить на вопросы типа: содержит ли набор элементов, поддерживаемых структурой данных, X?. Вы добавляете элементы в набор методом .add(). Вы запрашиваете существование элемента с помощью метода .contains(). - person Itay Maman; 20.07.2013
comment
Можете ли вы помочь мне указать правильное направление, как правильно распечатать слова, которые читаются из example.txt с его перевернутыми словами? Как вы можете видеть выше, код m позволяет распечатать только некоторые слова… есть ли способ сказать HashMap распечатать все, что находится в example.txt, с их перевернутыми? - person Ange; 20.07.2013