2013-11-07 3 views
1

Мне было предложено сделать это более экономичным, я предполагаю, что мне нужно использовать циклы, но я не совсем уверен, как это сделать, некоторая помощь будет оценена по достоинству.Java - Как я могу сделать это более эффективным?

(Для справки цель этой части коды, чтобы отобразить график в другую программу, используя данные, которые уже были собраны в другой программе)

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

    } 
} 
+2

Я тот, кто обычно ненавидит его, когда люди не отвечают на вопрос и просто жалуются, что это не «действительный» вопрос. Но это меня просто невероятно лениво. Быстрый поиск в Google на «java loops» и десять минут чтения, и вы бы не задали этот вопрос. – KyleM

+1

Также примечание об использовании «userXXX» в качестве имени пользователя. Он указывает всем здесь, что вы, вероятно, ничего не внесете в сообщество. Почему бы не потратить время на регистрацию оригинального имени пользователя. Извините, я закончил. Я перестану быть ворчливым. – KyleM

+0

Одним из улучшений будет создание метода, который принимает 'int' и' Bar' и в зависимости от 'a' изменяет цвет' bar'. Теперь, если у вас есть все «бары» в массиве, просто перебирайте их и используйте этот метод с текущим «баром» и значением из 'moduleMarks'. – Pshemo

ответ

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

Спасибо! Это удивительный ответ, не могли бы вы объяснить немного больше о том, что вы сделали с: 'int moduleMark: moduleMarks' – FinishLine

+0

Это версия Javas для каждого, это хорошо документировано здесь: http://docs.oracle .com/javase/1.5.0/docs/guide/language/foreach.html – Vegard

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 modules[] = new int[moduleMarks.length()]; 

Затем вы можете пройти с для петли и добавить:

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

Вы можете сделать аналогичные изменения в остальной части кода, используя это в качестве вдохновения.

+0

Помните, что если вы делаете что-то подобное много раз, часто бывает, что вы можете использовать какой-то цикл. Если вы не знаете своих циклов, я предлагаю прочитать несколько примеров и попробовать их, петли - это, в конце концов, некоторые из наиболее важных аспектов программирования. –

+0

Почему вы хотите скопировать один массив в другой, если вы можете просто использовать оригинальный? – Pshemo

-3

Поместите свои бары в массив (бар []). . Держите moduleMarks в массиве, что первоначально они пришли в Тогда вы можете использовать цикл или набор вложенных циклов:

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

Надеюсь, вы понимаете, что это домашнее задание человека, и, написав код для своего человека, вы не делаете им никаких выгод. – chubbsondubs

0

Сейчас этот код будет работают только в том случае, если элементы в модулеMarks составляют всего 6 элементов. Если в этом массиве было 9 элементов, будут отобраны только первые 6. Сорта делает этот код не очень полезным. Однако вы можете написать код, который будет принимать массив любой длины и отвечать соответствующим образом.

Вы дали подсказку, как начать этот процесс в коде вы Дано:

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

Это будет перебирать каждый член moduleMark независимо от длины. Таким образом, вам нужно применить эту идею к остальной части вашей программы, чтобы все, что делает ничья, будет работать независимо от размера модуляMark.

Вы увидите, что много кода повторяется для каждого элемента, соответствующего члену в модулеMark. Используйте циклы, чтобы уменьшить этот повторяющийся код. Вам придется моделировать вещи с помощью данных (т.е. массивов), чтобы переписать этот код, используя для циклов.

Я стараюсь не давать ответа, потому что это явно домашнее задание, и вы должны понять это сами.

+0

Спасибо за ответ: D Это была не «домашняя работа», а просто проект, и мне было указано, что это будет лучше, если бы я сделал это более эффективным по площади – FinishLine

+1

Мне понравился этот ответ +1, чтобы сделать его 0. – Devrim

+0

По домашнему заданию я имел в виду то, что вы делали для класса в классе, чтобы продемонстрировать некоторое мастерство понятий. Проект может означать проект для класса, который в основном здесь называется домашним заданием. Если это так, то я думаю, что важно, чтобы мы не сказали вам ответ и заставили вас понять это сами. – chubbsondubs

Смежные вопросы