首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三菱标志建筑商

三菱标志建筑商
EN

Code Review用户
提问于 2017-02-15 05:18:50
回答 1查看 230关注 0票数 2

我已经创建了一个三菱徽标生成器,它接受来自logo.txt文件的输入,并使用这些in /chars来创建logo.txt文件中标识的多个徽标。

我只是觉得我的代码是非常重复的,我想把它整理成单独的方法,而不是一遍又一遍地重复。对于如何清理这个问题,有什么建议吗?我将感谢任何和所有的反馈。甚至只是一个起点。

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 1

Code Review用户

发布于 2017-02-15 11:24:08

通过将重复代码移动到单独的方法中,可以逐步减少代码中的重复。

1.将打印一个徽标的代码移动到单独的方法中:

引入一种新方法,该方法准确地打印给定大小的一个徽标,然后在循环中调用它。

代码语言:javascript
复制
for(int bee = numLogos; bee > 0; bee--) { 
    printLogo(size);
}

顺便说一句,增加循环计数器在大多数情况下更容易读取。只要有可能,就使用它们:

代码语言:javascript
复制
for(int bee = 0; bee < numLogos; bee++) { 
    printLogo(size);
}

我还建议将bee重命名为有意义的东西(logoIndex),或者用泛型计数器变量(i)替换它。

2.打印相同字母

的合并循环

打印相同字母的连续循环,如下所示:

代码语言:javascript
复制
for(int x = 0; x < y; x++) {
    System.out.print(letter2);
}
for(int x = 0; x < size - y; x++) {
    System.out.print(letter2);
}

都是多余的。你需要把它们合并成一个:

代码语言:javascript
复制
for(int x = 0; x < size; x++) {
    System.out.print(letter2);
}

3.介绍一种字母打印

的方法(S)

当前,您的代码使用两种类型的循环进行打印:

代码语言:javascript
复制
//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);
}

您可以为这些操作创建两个单独的方法:

代码语言:javascript
复制
//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),但是您需要检查我的逻辑是否错误。

4.找出一个模式

在完成前面的步骤之后,您的主要打印方法将大致如下所示:

代码语言:javascript
复制
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);
        //...
    }
}

这些循环体看起来非常相似。它们都打印letter2letter1交替序列。为了消除它们,您可以引入一种方法,该方法接受一系列数字,并打印交替的字母序列:

代码语言:javascript
复制
 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参数的使用。这样,您就不必显式地创建数组。

您可以这样调用此方法:

代码语言:javascript
复制
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, ...);
    }
}

5.将参数转换为字段.

注意,在几种方法(letter1letter2size)中使用了一些值。您可以引入一个新的类,为这些值声明字段,并将它们传递给构造函数,而不是在每个方法中将它们作为参数传递。

示例:

代码语言:javascript
复制
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,那么您可以将商存储在一个常数数组中,主打印方法就会循环通过它。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/155401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档