Создавайте анаграммы и записывайте их в файл

Это код, который я написал, который будет использовать слово в качестве входных данных и записывать все его анаграммы в файл. Компилятор java заставляет меня использовать операторы try-catch каждый раз, когда я хочу что-то сделать с файлом. Я хочу знать, есть ли способ сделать мой код короче и читабельнее в целом. Как видите, внутри write_anagram функция, где я хочу поменять местами два индекса i а также j. Код был длинным, с таким количеством экземпляров substring а также charAt функция. Я хочу использовать его в своем школьном проекте, поэтому хочу, чтобы он был более читабельным для экзаменатора. Какие улучшения я могу сделать? Есть ли альтернатива FileWriter так что мне не нужно использовать try catch много раз?

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Anagrams
{
    int count;
    FileWriter f;
    
    void write(String s)
    {
        try
        {
            f.write(s+"n");
        }
        catch (IOException e)
        {
            System.out.println("An error ocurred while writing to the file");
            System.exit(0);
        }
    }
    
    void write_anagrams(String s, int start)
    {
        int i, j;
        String n;
        for(i=start; i<s.length(); i++)
        {
            for(j=i+1; j<s.length(); j++)
            {
                n = s.substring(0,i)+s.charAt(j)+s.substring(i+1, j)+s.charAt(i)+s.substring(j+1);
                write(n);
                count++;
                write_anagrams(n, i+1);
            }
        }
    }
    
    void write_anagrams(String s)
    {
        try
        {
            f = new FileWriter("AnagramsByJava.txt");
        }
        catch (IOException e)
        {
            System.out.println("An error ocurred while opening the file");
        }
        count = 1;
        write(s);
        write_anagrams(s, 0);
        try
        {
            f.close();
        }
        catch (IOException e)
        {
            System.out.println("An error ocurred while closing the file");
        }
        System.out.println(count+" anagrams have been written to AnagramsByJava.txt");
    }
    
    public static void main()
    {
        Scanner sc = new Scanner(System.in);
        Anagrams object = new Anagrams();
        System.out.print("Enter a word: ");
        String s = sc.next();
        object.write_anagrams(s);
    }
}

1 ответ
1

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

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

Вы также должны использовать close() на ваших ресурсах. Вы можете использовать шаблон «попробуйте с ресурсами», чтобы сделать это за вас. В моем примере я использую try только для этого — я еще не catchничего.

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

Тогда просто некоторые мелочи, чтобы дать вам вдохновение re: читаемость. Погуглите все, с чем вы не знакомы (StringBuilder, BufferedWriter, System.out.format).

Я не касался вашей основной логики анаграммы, хотя я поместил ее в несколько строк, пытаясь сделать ее удобочитаемой. Если честно, меня до сих пор смущает, как это работает, но вроде как минимум работает …!

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Scanner;

public class Anagrams_mine {

    private static int write_anagrams(Writer f, String s, int start, int count)
            throws IOException {
        for (int i = start; i < s.length(); i++) {
            for (int j = i + 1; j < s.length(); j++) {
                String n = new StringBuilder(s.length())
                        .append(s.substring(0, i))
                        .append(s.charAt(j))
                        .append(s.substring(i + 1, j))
                        .append(s.charAt(i))
                        .append(s.substring(j + 1))
                        .toString();
                f.write(n + "n");
                count = write_anagrams(f, n, i + 1, count + 1);
            }
        }
        return count;
    }

    static int write_anagrams(Writer f, String s) throws IOException {
        f.write(s + "n");
        return write_anagrams(f, s, 0, 1);
    }

    public static void main(String[] args) throws IOException {
        try (Scanner scanner = new Scanner(System.in);
                Writer f = new BufferedWriter(new FileWriter("AnagramsByJava.txt"))) {
            System.out.print("Enter a word: ");
            int count = write_anagrams(f, scanner.next());
            f.flush();
            System.out.format("%s anagrams have been written.", count);
        }
    }
}

  • Большое спасибо за этот код. Эй, эта логика проста. Он основан на обмене индексами. Скажем, у вас есть слово ABCD … Мы поменяем местами 0 и 1 индекс, затем 0 и 2 индекса и так далее … Теперь каждый из переставленных, скажем, BACD поменяется местами дальше от 1 индекса, т.е. e, мы меняем местами 1 и 2 индексы, 1 и 3 и так далее … Итак, это продолжается в рекурсии, пока у нас не будут все анаграммы … !!

    — Ничего особенного



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *