Java - 如何使这更节省空间?

时间:2013-11-07 16:05:04

标签: java loops for-loop whitespace performance

我被要求使这个空间更有效率,我假设我需要使用循环,但我不完全确定如何,一些帮助将不胜感激。

(作为参考,这段代码的目的是使用已在其他程序中收集的数据将图形显示到另一个程序中)

 public class StudentChart 
{
    public StudentChart(int[] moduleMarks)  //Constructor
    {
        Bar y = new Bar();
        y.makeVisible();
        y.changeSize(1, 100);
        y.moveVertical(100);
        y.moveHorizontal(-1);
        y.changeColour(Colour.BLACK);
        //y-axis is produced
        Bar x = new Bar();
        x.makeVisible();
        x.changeSize(200,1);
        x.moveVertical(200);
        x.changeColour(Colour.BLACK);
        //x-axis is produced
        draw(moduleMarks);
        printSummary(moduleMarks);
    }

    public static void draw(int[] moduleMarks)
    {

        int a = moduleMarks[0];
        int b = moduleMarks[1];
        int c = moduleMarks[2];
        int d = moduleMarks[3];
        int e = moduleMarks[4];
        int f = moduleMarks[5];
        //stores module marks from array as variables to be used later
        Bar mod1 = new Bar();
        Bar mod2 = new Bar();
        Bar mod3 = new Bar();
        Bar mod4 = new Bar();
        Bar mod5 = new Bar();
        Bar mod6 = new Bar();

        mod1.makeVisible();
        mod2.makeVisible();
        mod3.makeVisible();
        mod4.makeVisible();
        mod5.makeVisible();
        mod6.makeVisible();
        //Bars are initialised and made visible
        mod1.moveVertical(200-a);
        mod2.moveVertical(200-b);
        mod3.moveVertical(200-c);
        mod4.moveVertical(200-d);
        mod5.moveVertical(200-e);
        mod6.moveVertical(200-f);
        //Bars are moved based on their height so that they touch the x-axis
        mod1.changeSize(15, a);
        mod2.changeSize(15, b);
        mod3.changeSize(15, c);
        mod4.changeSize(15, d);
        mod5.changeSize(15, e);
        mod6.changeSize(15, f);
        //Bar height changes depending on the module marks
        mod1.moveHorizontal(0);
        mod2.moveHorizontal(35);
        mod3.moveHorizontal(70);
        mod4.moveHorizontal(105);
        mod5.moveHorizontal(140);
        mod6.moveHorizontal(175);
        //Bars are moved across so can be seen on chart
        if (a<35)
        {
            mod1.changeColour(Colour.RED);
        }
        if (a>= 35 && a<40)
        {
            mod1.changeColour(Colour.YELLOW);
        }   
        if (a>= 40 && a<70)
        {
            mod1.changeColour(Colour.GREEN);
        }
        if (a>= 70)
        {
            mod1.changeColour(Colour.MAGENTA);
        }

        if (b<35)
        {
            mod2.changeColour(Colour.RED);
        }
        if (b>= 35 && a<40)
        {
            mod2.changeColour(Colour.YELLOW);
        }   
        if (b>= 40 && a<70)
        {
            mod2.changeColour(Colour.GREEN);
        }
        if (b>= 70)
        {
            mod2.changeColour(Colour.MAGENTA);
        }

        if (c<35)
        {
            mod3.changeColour(Colour.RED);
        }
        if (c>= 35 && a<40)
        {
            mod3.changeColour(Colour.YELLOW);
        }   
        if (c>= 40 && a<70)
        {
            mod3.changeColour(Colour.GREEN);
        }
        if (c>= 70)
        {
            mod3.changeColour(Colour.MAGENTA);
        }

        if (d<35)
        {
            mod4.changeColour(Colour.RED);
        }
        if (d>= 35 && a<40)
        {
            mod4.changeColour(Colour.YELLOW);
        }   
        if (d>= 40 && a<70)
        {
            mod4.changeColour(Colour.GREEN);
        }
        if (d>= 70)
        {
            mod4.changeColour(Colour.MAGENTA);
        }

        if (e<35)
        {
            mod5.changeColour(Colour.RED);
        }
        if (e>= 35 && a<40)
        {
            mod5.changeColour(Colour.YELLOW);
        }   
        if (e>= 40 && a<70)
        {
            mod5.changeColour(Colour.GREEN);
        }
        if (e>= 70)
        {
            mod5.changeColour(Colour.MAGENTA);
        }

        if (f<35)
        {
            mod6.changeColour(Colour.RED);
        }
        if (f>= 35 && a<40)
        {
            mod6.changeColour(Colour.YELLOW);
        }   
        if (f>= 40 && a<70)
        {
            mod6.changeColour(Colour.GREEN);
        }
        if (f>= 70)
        {
            mod6.changeColour(Colour.MAGENTA);
        }
        //Colour changes depending on module mark
        //Could be improved
    }

    public static void printSummary(int[] moduleMarks)
    {
        for(int i =0; i<moduleMarks.length; i=i+1)
        {
            System.out.println("Module "+ (i+1) + " " + moduleMarks[i]);
        }
        //Prints module marks in a table
    }

    public static void main(String[] args)
    {

    }
}

4 个答案:

答案 0 :(得分:2)

你可以这样做:

    int horizontalMovement = 0;
    for (int moduleMark : moduleMarks) {
        Bar bar = new Bar();
        bar.makeVisible();
        bar.moveVertical(200 - moduleMark);
        bar.changeSize(15, moduleMark);
        bar.moveHorizontal(horizontalMovement);
        horizontalMovement = horizontalMovement + 35;
        if (moduleMark < 35) {
            bar.changeColour(Colour.RED);
        } else if (moduleMark < 40) {
            bar.changeColour(Colour.YELLOW);
        } else if (moduleMark < 70) {
            bar.changeColour(Colour.GREEN);
        } else {
            bar.changeColour(Colour.MAGENTA);
        }
    }

答案 1 :(得分:0)

你可以在这里做很多事情:

    int a = moduleMarks[0];
    int b = moduleMarks[1];
    int c = moduleMarks[2];
    int d = moduleMarks[3];
    int e = moduleMarks[4];
    int f = moduleMarks[5];

在这里你可以创建一个int数组:

int modules[] = new int[moduleMarks.length()];

然后你可以使用for循环并添加:

for(int i = 0; i < 6; i++) {
   modules[i] = moduleMarks[i];
}

您可以使用此作为灵感对代码的其余部分进行类似的更改。

答案 2 :(得分:0)

现在,只有当moduleMarks中的元素只有6个元素长时,此代码才有效。如果该数组中有9个元素,则只绘制前6个元素。 Sorta使这段代码不是非常有用。但是,您可以编写接受任意长度数组的代码并做出相应的响应。

您已经获得了如何在给出的代码中启动该过程的提示:

for(int i =0; i<moduleMarks.length; i=i+1)
{
    System.out.println("Module "+ (i+1) + " " + moduleMarks[i]);
}

无论长度如何,它都会遍历moduleMark的每个成员。所以你需要将这个想法应用到你的程序的其余部分,这样无论drawMark的大小如何,绘制的任何东西都将起作用。

您会看到,对于moduleMark中的成员,每个元素都会重复执行大量代码。使用循环来减少重复的代码。您必须使用数据(即数组)对事物进行建模,以便使用for循环重写该代码。

我试图不给出答案,因为这显然是家庭作业,你应该自己解决。

答案 3 :(得分:-3)

将你的酒吧放入一个数组(Bar [])。将你的moduleMark保存在他们最初进入的数组中。然后你可以使用一个循环或一组嵌套循环:

 for(int i = 0; i < modArray.size; ++i) {
      modArray[i].makeVisible();
      modArray[i].moveVertical(200-moduleMarks[i]);
      modArray[i].changeSize(15, moduleMarks[i]);
      modArray[i].moveHorizontal(35*i);

      //etc.
 }