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

Java-如何使其更节省空间?,java,loops,for-loop,whitespace,performance,Java,Loops,For Loop,Whitespace,Performance,我被要求提高空间效率,我假设我需要使用循环,但我不完全确定如何使用,希望能得到一些帮助 作为参考,这段代码的目的是使用已在另一个程序中收集的数据将图形显示到另一个程序中 public class StudentChart { public StudentChart(int[] moduleMarks) //Constructor { Bar y = new Bar(); y.makeVisible(); y.changeSiz

我被要求提高空间效率,我假设我需要使用循环,但我不完全确定如何使用,希望能得到一些帮助

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

 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)
    {

    }
}

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

    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];
}

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

将您的条放入数组条[]。将模块标记保留在它们最初出现的数组中。然后可以使用一个循环或一组嵌套循环:

 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.
 }

你可以这样做:

    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);
        }
    }

现在,只有当moduleMarks中的元素只有6个元素长时,此代码才会工作。如果该数组中有9个元素,则只会绘制前6个元素。Sorta使这段代码没有太大用处。但是,您可以编写接受任意长度数组并相应响应的代码

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

for(int i =0; i<moduleMarks.length; i=i+1)
{
    System.out.println("Module "+ (i+1) + " " + moduleMarks[i]);
}
它将迭代moduleMark的每个成员,而不考虑长度。因此,您需要将此思想应用到程序的其余部分,以便无论模块标记的大小如何,绘图都能正常工作

您将看到,对于moduleMark中对应于成员的每个元素,都有大量重复的代码。使用循环来减少重复的代码。为了使用for循环重写代码,您必须使用数据ie数组对事情进行建模


我尽量不泄露答案,因为这显然是家庭作业,你应该自己解决

请记住,如果您多次执行类似的操作,通常可以使用某种循环。如果你不知道自己的循环,我建议你阅读一些例子并尝试一下,循环毕竟是编程中最重要的方面。如果你可以使用原始数组,为什么你要将一个数组复制到另一个数组?我通常不喜欢人们不回答这个问题,只是抱怨这不是一个有效的问题。但这让我感到难以置信的懒惰。在谷歌上快速搜索java循环和十分钟的阅读,你就不会问这个问题了。还有一个关于使用userXXX作为用户名的说明。它向这里的每个人表明,你可能不会对社区做出任何贡献。为什么不花点时间注册一个原始用户名呢。对不起,我已经做完了。我不会再发牢骚了。其中的一个改进是创建一个接受int和Bar的方法,并根据Bar的颜色变化。现在,如果数组中有所有的条,只需对它们进行迭代,并对moduleMarks中的当前条和值使用此方法。嘿,即使看到Vegard的解决方案,我也开始思考我应该如何做。我百分之百地想为社区做贡献,我只是一个新手,我不知道我必须更改我的用户名!。我希望你能意识到这是一个人的家庭作业,为他写代码并不是在帮他。谢谢你的回答:这不是家庭作业,只是一个项目-有人向我指出,如果我能更节省空间,那会更好。我喜欢答案+1,使其为0。我所说的家庭作业是指你在课堂上为一个年级做的一些事情,以证明你对概念的掌握。一个项目可能意味着一个班级的项目,主要在这里被称为家庭作业。如果是这样的话,我认为重要的是我们不要告诉你答案,让你自己去想。谢谢!这是一个很棒的答案,你能解释一下你用int moduleMark做了什么吗:modulemarks是for each的Javas版本,这里有很好的文档记录: