Java-программа, которая принимает входное слово и выводит любые анаграммы, найденные в импортированном файле .txt? - PullRequest
1 голос
/ 01 апреля 2019

Для выполнения задания по курсу информатики, который я беру в этом семестре, мне нужно создать Java-программу, которая импортирует файл .txt слов, принимает слово в качестве ввода, шифрует входное слово, затем выводит списоканаграмм (т. е. слов, равных по длине скремблированному слову, которые используют точно такие же буквы) для схватки.Программа также должна иметь возможность зацикливаться, чтобы пользователь мог вводить новое слово после получения вывода, повторять программу или вводить определенный символ для завершения программы.

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

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

1) Мне нужно разделить различные части кода на несколькометоды, но я не уверен, как мне отделить, организовать или получить доступ к ним из метода main.

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

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Anagrams {

    public static void main(String[] args) throws FileNotFoundException {

        System.out.println("Welcome to X's Anagram Solver!");
        System.out.println("Please enter a word to scramble to continue, or enter 'n' or 'N' to quit:");

        List<String> words = new ArrayList<>();
        try (Scanner Kbin = new Scanner(new File("dict.txt"))){
            while (Kbin.hasNext()) {
                words.add(Kbin.next());
            }
        }
        Map<String, List<String>> map = new HashMap<>();

        for (String str : words) {
            char[] temp = str.toCharArray();
            Arrays.sort(temp);
            String key = new String(temp).toLowerCase();
            if (map.get(key) != null) {
                map.get(key).add(str.toLowerCase());
            }
            else {
                List<String> anagramList = new ArrayList<>();
                anagramList.add(str);
                map.put(key, anagramList);
            }
        }

        Scanner input = new Scanner(System.in);
        String str = input.next();
        char[] key = str.toCharArray();
        Arrays.sort(key);
        str = new String(key).toLowerCase();
        if (!map.containsKey(str)) {
            System.out.println("The input word was not found in our dictionary file.");
            System.out.println("Please enter a different word to scramble to continue, or enter 'n' or 'N' to quit:");
        }
        else if (map.get(str).size() != 1) {
            System.out.println("All words found in '" + str + "':");
            for (String p : map.get(str)) {
                System.out.println(p + " ");
            }
            System.out.println("You may enter a new word to scramble, or enter 'n' or 'N' to quit:");
        }
        else {
            System.out.println("No anagrams for this word were found.");
            System.out.println("You may enter a new word to scramble, or enter 'n' or 'N' to quit:");
        }
        str = input.next();

        System.out.println("Thank you for using X's Anagram Solver!");
        System.out.println("Have a nice day!");

        input.close();  
        }

    }

Для ясности, если бы пользователь вводил слово "доля" для программы, это слово было бы зашифровано и сохранено вэто каноническая форма (буквы хранятся в отсортированном порядке).Затем программа определит, присутствует ли слово «share» в файле .txt и имеют ли другие слова одинаковые буквы.В результате получается список слов в .txt, которые имеют те же буквы, что и «share», например:

  • hares
  • слышит
  • share
  • shear

Как разделить различные разделы моего кода на методы?И как я могу реализовать цикл, как только я это сделал?Я действительно в растерянности, и мне просто нужно какое-то руководство по этому вопросу, и я был бы очень признателен, если бы кто-нибудь смог пролить свет на то, что я должен делать.

Заранее благодарю всех, кто может мне помочь с этим!

PS Извините, но у меня нет возможности предоставить файл .txt, используемый в коде, но это в основном просто длинный алфавитный список слов.

1 Ответ

0 голосов
/ 01 апреля 2019

может быть вот так oO

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Anagrams {

   Map<String, List<String>> map;

   Anagrams(){
      map  = getAnagrams();
   }

    private List<String> getWords(){
        List<String> words=new ArrayList<>();
        try (Scanner Kbin = new Scanner(new File("dict.txt"))){
            while (Kbin.hasNext()) {
                words.add(Kbin.next());
            }
        } catch (FileNotFoundException e) {
            System.out.println("couldnt find dict.txt");
        }
        return words;
    }

    private Map<String,List<String>> getAnagrams(){
        Map<String, List<String>> map = new HashMap<>();
        List<String> words = getWords();
        for (String str : words) {
            String key = sorted(str);
            if (map.get(key) != null) {
                map.get(key).add(str.toLowerCase());
            }
            else {
                List<String> anagramList = new ArrayList<>();
                anagramList.add(str);
                map.put(key, anagramList);
            }
        }
        return map;
    }

    public String sorted(String unsorted){
        char[] key = unsorted.toCharArray();
        Arrays.sort(key);
        return new String(key).toLowerCase();

    }

    public void evaluate(String str){
        str=sorted(str);
        if (!map.containsKey(str)) {
            System.out.println("The input word was not found in our dictionary file.");
            System.out.println("Please enter a different word to scramble to continue, or enter 'n' or 'N' to quit:");
        }
        else if (map.get(str).size() != 1) {
            System.out.println("All words found in '" + str + "':");
            for (String p : map.get(str)) {
                System.out.println(p + " ");
            }
            System.out.println("You may enter a new word to scramble, or enter 'n' or 'N' to quit:");
        }
        else {
            System.out.println("No anagrams for this word were found.");
            System.out.println("You may enter a new word to scramble, or enter 'n' or 'N' to quit:");
        }
        System.out.println("Thank you for using X's Anagram Solver!");
        System.out.println("Have a nice day!");

    }

    public static void main(String[] args) throws FileNotFoundException {

        System.out.println("Welcome to X's Anagram Solver!");
        System.out.println("Please enter a word to scramble to continue, or enter 'n' or 'N' to quit:");



        Scanner input = new Scanner(System.in);

        Anagrams anagrams=new Anagrams();

        String str=input.next();
        while(!"exit".equals(str)){

            anagrams.evaluate(str);
            str=input.next();
        }       
        input.close();  
    }

}
...