Это код, который я написал, который будет использовать слово в качестве входных данных и записывать все его анаграммы в файл. Компилятор 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 ответ
(Я немного нервничаю, отвечая на вопрос, так как вы упомянули, что это экзамен, но с другой стороны, мы здесь, чтобы помочь вам учиться, и вам и вашим экзаменаторам нужно следить за тем, чтобы вы поступали правильно с любой полученной помощью. .)
Поскольку вы спрашивали об исключениях, ответ таков: если вы планируете просто аварийно завершить работу при исключении, просто не делайте этого. 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 и так далее … Итак, это продолжается в рекурсии, пока у нас не будут все анаграммы … !!
— Ничего особенного