2016-11-08 4 views
1

Я разместил свой код ниже. У меня проблема на строке, объявляющей массив wrongAnswers. Мне удалось запустить мой код раньше, но проблема в том, что кто-то взял на себя все, чтобы удалить все мои файлы. Мне удалось заставить его работать без использования List или ArrayList. Я просто хочу понять, как я могу получить эту работу сейчас, прежде чем попытаться использовать любой из этих методов. Я понимаю, что массивы Java неизменяемы. Тем не менее, я все еще как-то мог заставить его работать раньше. Если бы кто-то помог мне понять, что я сделал раньше, я был бы очень любезен.Объявление размера массива

private Scanner keyboard = new Scanner(System.in); 

private final String[] testAnswers = { 
     "B","D","A","A","C", 
     "A","B","A","C","D", 
     "B","C","D","A","D", 
     "C","C","B","D","A"}; 
private String[] studentAnswers = new String[20]; 
/* 
private String[] studentAnswers = { 
     "B","D","A","A","C", 
     "A","B","A","C","D", 
     "B","C","D","A","D", 
     "C","C","B","D","A"}; 
*/ 
private int[] wrongAnswers; 
private int answeredCorrectly = 0; 

public void getStudentAnswers() { 
    for(int x = 0; x < 20; x++) { 
     do { 
      System.out.print("Enter answer for #" + (x + 1) + " : "); 
      this.studentAnswers[x] = keyboard.next().toUpperCase(); 
      if (!"A".equals(this.studentAnswers[x]) && 
        !"B".equals(this.studentAnswers[x]) && 
        !"C".equals(this.studentAnswers[x]) && 
        !"D".equals(this.studentAnswers[x])) { 
       System.out.println("Invalid input."); 
      } 
     } while(!"A".equals(this.studentAnswers[x]) && 
       !"B".equals(this.studentAnswers[x]) && 
       !"C".equals(this.studentAnswers[x]) && 
       !"D".equals(this.studentAnswers[x])); 
    } 
} 

public int totalCorrect() { 
    int arrayLocation = 0; 

    for(int x = 0; x < 20; x++) { 
     if (this.studentAnswers[x].equals(this.testAnswers[x])) 
      this.answeredCorrectly++; 
     else 
      this.wrongAnswers[arrayLocation++] = x; 
    } 

    return this.answeredCorrectly; 
} 

public int totalIncorrect() { 
    return 20 - this.answeredCorrectly; 
} 

public boolean passed() { 
    return this.answeredCorrectly >= 15; 
} 

public void questionsMissed() { 
    if(this.answeredCorrectly != 20) { 
      for(int x = 0; x < this.wrongAnswers.length; x++) { 
      System.out.println(this.wrongAnswers[x]); 
     } 
    } 
} 
+0

'wrongAnswers = new int [someNumber];' Но я думаю, что было бы лучше использовать List вместо – litelite

+0

. Я не смог бы этого сделать, поскольку размер массива wrongAnswers зависит от того, сколько правильных ответов было задано , Он будет меняться каждый раз, когда я запускаю программу. Количество должно быть гибким. –

+1

Либо вам нужно вручную создавать новые большие, и копировать старый + новый неправильный ответ в каждый раз, когда вы хотите его добавить. Или используйте 'ArrayList' – litelite

ответ

1

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

Я нахожу вывод полезным при решении подобных проблем. Условия:

1) Массивы неизменны 2) Вы хотите выделить точное количество пространства, которое вам нужно

Пункт 2 ставит вопрос: как вы знаете, сколько места вам нужны? Очевидный ответ: знаете, сколько (правильных) ответов у вас есть. После этого вы можете сделать:

public int totalCorrect() { 
    for(int x = 0; x < 20; x++) { 
     if (this.studentAnswers[x].equals(this.testAnswers[x])) 
      this.answeredCorrectly++; 
    } 

    this.wrongAnswers = int[20 - this.answeredCorrectly]; 

    // Here you want to create your wrongAnswers, but you have to go over 
    // the same array twice... 
    int arrayLocation = 0; 
    for(int x = 0; x < 20; x++) { 
     if (!this.studentAnswers[x].equals(this.testAnswers[x])) 
      this.wrongAnswers[arrayLocation++] = x; 
    } 


    return this.answeredCorrectly; 
} 

Есть, вероятно, больше способов сделать что-то подобное и добиться лучшей производительности. На первый взгляд они кажутся мне плохими подходами, и я бы использовал Список, как уже было предложено, или, возможно, набор, но кто знает ...

+0

Я попробую это, как только я войду в класс. Я, наконец, обернулся и узнал ArrayList. Хотя, я уверен, что мой учитель будет отбирать очки для того, чтобы прыгать вперед в главе, в которой я участвую, используя ее –

0

private int [] wrongAnswers = new int [20] ;

+0

Это неверно –

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