我已经创建了一个三菱徽标生成器,它接受来自logo.txt文件的输入,并使用这些in /chars来创建logo.txt文件中标识的多个徽标。
我只是觉得我的代码是非常重复的,我想把它整理成单独的方法,而不是一遍又一遍地重复。对于如何清理这个问题,有什么建议吗?我将感谢任何和所有的反馈。甚至只是一个起点。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
input = new Scanner(new FileInputStream("config.txt"));
//initialize ithe variable's input and output
} catch (FileNotFoundException e) {
System.out.println("File not found.");
System.exit(0);
}
int size = Integer.parseInt(inputStream.nextLine());
int numLogos = Integer.parseInt(inputStream.nextLine());
char letter1 = inputStream.next().charAt(0);
char letter2 = inputStream.next().charAt(0);
for(int bee = numLogos; bee > 0; bee--){
for(int y = 0; y < size; y++) {
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = size; x > y; x--) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = size; x > y; x--) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
System.out.println();
}
for(int y = 0; y < size; y++) {
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}
System.out.println();
}
for(int y = 0; y < size; y++) {
for(int x = size; x > y; x--) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter1);
}
for(int x = size; x > y; x--) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter1);
}
for(int x = 0; x < y; x++) {
System.out.print(letter1);
}
for(int x = size; x > y; x--) {
System.out.print(letter2);
}
System.out.println();
}
}
}发布于 2017-02-15 11:24:08
通过将重复代码移动到单独的方法中,可以逐步减少代码中的重复。
引入一种新方法,该方法准确地打印给定大小的一个徽标,然后在循环中调用它。
for(int bee = numLogos; bee > 0; bee--) {
printLogo(size);
}顺便说一句,增加循环计数器在大多数情况下更容易读取。只要有可能,就使用它们:
for(int bee = 0; bee < numLogos; bee++) {
printLogo(size);
}我还建议将bee重命名为有意义的东西(logoIndex),或者用泛型计数器变量(i)替换它。
的合并循环
打印相同字母的连续循环,如下所示:
for(int x = 0; x < y; x++) {
System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
System.out.print(letter2);
}都是多余的。你需要把它们合并成一个:
for(int x = 0; x < size; x++) {
System.out.print(letter2);
}的方法(S)
当前,您的代码使用两种类型的循环进行打印:
//type 1: prints a given number of letters
for(int x = 0; x < someLimit; x++) {
System.out.print(someLetter);
}
//type 2: prints a number of letters necessary to leave space at the end
for(int x = size; x > numbersAtTheEnd; x--) {
System.out.print(someLetter);
}您可以为这些操作创建两个单独的方法:
//Example for the first type of loop
public static void printLetter(char letter, int count) {
for(int x = 0; x < count; x++) {
System.out.print(letter);
}
}
public static void printLetterUntil(char letter, int size, int left) {
for(int x = size; x > left; x--) {
System.out.print(letter);
}
}
//then call this method repeatedly:
printLetter(letter2, y);
printLetter(letter2, size-y);
printLetter(letter2, y);我建议把第二种改为第一种。printLetterUntil(letter, size, left)似乎等同于printLetter(letter, size-left),但是您需要检查我的逻辑是否错误。
在完成前面的步骤之后,您的主要打印方法将大致如下所示:
static void printLogo(int size) {
for(int y = 0; y < size; y++) {
printLetter(letter2, someCount);
printLetter(letter1, anotherCount);
printLetter(letter2, yetAnotherCount);
//skipped similar lines
System.out.println();
}
for(int y = 0; y < size; y++) {
//second part
printLetter(letter2, someCount);
printLetter(letter1, anotherCount);
//...
}
for(int y = 0; y < size; y++) {
//third part
printLetter(letter2, someCount);
printLetter(letter1, anotherCount);
//...
}
}这些循环体看起来非常相似。它们都打印letter2和letter1交替序列。为了消除它们,您可以引入一种方法,该方法接受一系列数字,并打印交替的字母序列:
public static void printAlternatingSequence(char letter1, char letter2, int... segments) {
for(int i=0; i<segments.length; i++) {
\\print letter2 for even indices and letter1 for odd
char currentLetter = i%2==0 ? letter2 : letter1;
printLetter(currentLetter, segments);
}
}注意varargs参数的使用。这样,您就不必显式地创建数组。
您可以这样调用此方法:
static void printLogo(int size) {
for(int y = 0; y < size; y++) {
printAlternatingSequence(letter1, letter2, someCount, anotherCount, ...);
}
for(int y = 0; y < size; y++) {
printAlternatingSequence(letter1, letter2, someCount, anotherCount, ...);
}
for(int y = 0; y < size; y++) {
printAlternatingSequence(letter1, letter2, someCount, anotherCount, ...);
}
}注意,在几种方法(letter1、letter2、size)中使用了一些值。您可以引入一个新的类,为这些值声明字段,并将它们传递给构造函数,而不是在每个方法中将它们作为参数传递。
示例:
public class MitsubishiLogoPrinter {
private final int size;
private final char letter1;
private final char letter2;
public MitsubishiLogoPrinter(int size, char letter1, char letter2) {
this.size = size;
this.letter1 = letter1;
this.letter2 = letter2;
}
public void printLogo() {
//skipped implementation
}
private void printAlternatingSequence(int... segments) {
//skipped implementation
}
}看看打印出来的片段的长度。也许,那里也有一个可用的模式。如果您可以将每个段的长度表示为f(size, lineNumber) = k*size+l*lineNumber,那么您可以将商存储在一个常数数组中,主打印方法就会循环通过它。
https://codereview.stackexchange.com/questions/155401
复制相似问题