Рекурсия для разделения одного слова на три или более слова Java - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь написать программу, которая будет принимать входные данные из документа dictionary.txt и будет сохранять слова в списке словарей, а затем определять, можно ли разбить слово на три или более слов, и если да, то печать исходное слово, за которым следуют новые слова, например disconsolateness:disc on so lateness, будет выводом в документе составеMore.txt. Прямо сейчас код просто продолжает работать, но я не получаю никакого вывода, и я не уверен, что я делаю неправильно. Любая помощь, которую вы можете предоставить, будет принята с благодарностью. Я разместил свой код ниже, и вводом является любое слово в словаре.

import java.util.*;
import java.io.*;
public class CompositionTwo
{
    private static List<String> dictionary = new ArrayList<>();
    public static void main(String []args) { 
        File inputFile = new File("dictionary.txt");
        File outputFile = new File("composedMore.txt");
        Scanner in = null;
        PrintWriter out = null;

        try {
            in = new Scanner(inputFile);
            out = new PrintWriter(outputFile);
            while (in.hasNext()) {
                String input = in.next();
                dictionary.add(input);
                String output = splitWord(input, "");
                if (output != "") {
                    out.println(input + ":" + output);
                }
            }
        } catch (IOException e) {
            System.out.println("An IOException has occurred during output process.");
        } finally {
            in.close();
            out.close();
        }

    } 

    public static String splitWord(String word, String output) {

        if (word.length() == 0) {
            output = output;
        }
        else {
            for (int i = 1; i <= word.length(); i++) {
                // consider all prefixes of current String
                String prefix = word.substring(0, i);

                // if the prefix is present in the dictionary, add prefix to the
                // output String and recurse for remaining String

                if (dictionary.contains(prefix)) {
                    splitWord(word.substring(i), output + " " + prefix);
                }
            }
        }

        return output;
    }  
} 

Ответы [ 2 ]

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

Предположим, у вас есть этот словарь:

disc
on
so
lateness

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

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

return prefix + " " + splitWord(word.substring(i), output);

, чтобы каждое найденное слово объединялось после каждого вызова метода.

Очевидно, что, как вы уже сделали, мое условие остановки сохраняется, когдав переменной output.

    package io.gdfb.questions;

    import java.util.*;
    import java.io.*;

    public class CompositionTwo {
        private static List<String> dictionary = new ArrayList<>();

        public static void main(String[] args) {
            loadDictionary();

            File outputFile = new File("composedMore.txt");
            PrintWriter out = null;
            try {
                out = new PrintWriter(outputFile);
                String output = splitWord(args[0], "");
                if (output != "") {
                    out.println(args[0] + ":" + output);
                }
            } catch (IOException e) {
                System.out.println("An IOException has occurred during output process.");
            } finally {
                out.flush();
                out.close();
            }

        }

        private static void loadDictionary() {
            InputStream inputFile = Thread.currentThread().getContextClassLoader().getResourceAsStream("dictionary.txt");
            Scanner in = null;
            try {
                in = new Scanner(inputFile);
                while (in.hasNext()) {
                    String input = in.next();
                    dictionary.add(input);
                }
            } finally {
                in.close();
            }
        }

        public static String splitWord(String word, String output) {
            for (int i = 1; i <= word.length(); i++) {
                // consider all prefixes of current String
                String prefix = word.substring(0, i);
                // if the prefix is present in the dictionary, add prefix to the
                // output String and recurse for remaining String
                if (dictionary.contains(prefix)) {
                    return prefix + " " + splitWord(word.substring(i), output);
                }
            }
            return output;
        }
    } 
больше нет символов
0 голосов
/ 25 апреля 2019

Сначала добавьте все слова в словарь, а затем проверьте каждое слово, потому что вам нужно сравнить все слова в файле. Процесс, который вы приняли, просто сравнил слова перед сравниваемым словом

import java.util.*;

 import java.io.*;

 public class CompositionTwo
 {

private static List<String> dictionary = new ArrayList<>();
public static void main(String []args) { 
    File inputFile = new File("dictionary.txt");
    File outputFile = new File("composedMore.txt");
    Scanner in = null;
    PrintWriter out = null;
    String word;

    try {
        in = new Scanner(inputFile);
        out = new PrintWriter(outputFile);
        //Read the file indictionary
        while (in.hasNext()) {
            String input = in.next();
            dictionary.add(input);
        }

        //Check All the words in dictionary for Splitting
        for(int i=0;i<dictionary.size();i++)
        {
            String output = splitWord(dictionary.get(i), "");
            if (!"".equals(output)) {
                String outa[] = output.split("\\s") ;
                if(outa.length >= 3) // Check if 3 words are created as output
                {
                System.out.println(dictionary.get(i) + ":" + output);
                out.println(dictionary.get(i) + ":" + output);
                }
            }
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
    } finally {
        in.close();
        out.close();
    }

} 

public static String splitWord(String word, String output) {

    if (word.length() == 0) {
        return output;
    }
    else {
        for (int i = 1; i <= word.length(); i++) {
            // consider all prefixes of current String
            String prefix = word.substring(0, i);

            // if the prefix is present in the dictionary, add prefix to the
            // output String and recurse for remaining String

            if (dictionary.contains(prefix)) {
                return splitWord(word.substring(i), output + " " + prefix);
            }
        }
    }

    return output ;

}  

}

...