2015-10-17 4 views
2
import java.util.Scanner; 

public class scores 
{ 
    static Scanner input = new Scanner(System.in); 
    public static void main(String[] args) 
    { 
     System.out.print("\f"); 
     int classSize, counterScore, counterName; 
     String name; 
     double score,average, sum; 

     System.out.print("Enter size of class: "); 
     classSize = input.nextInt(); 

     int[] scoreArray = new int[classSize]; 
     String[] nameArray = new String[classSize]; 

     counterScore=1; 
     counterName = 1; 
     average = 0; 
     sum = 0; 

     for (int x = 0; x < classSize; x++) 
     { 
      input.nextLine(); 
      System.out.print("Student " + counterName++ + " Name: "); 
      nameArray[x] = input.nextLine(); 
      System.out.print("Student " + counterScore++ + " Score: "); 
      scoreArray[x] = input.nextInt(); 

      sum = sum + scoreArray[x]; 
      average = sum/classSize; 
     } 

     System.out.println(average); 
    } 
} 

Мне нужно сделать приложение, которое позволяет мне сказать, сколько людей прошли тест, а затем введите свои имена и оценки. Я использовал два разных массива, так как один - это строка и один - двойной. Мой вывод предназначен для чтения, имена которого попадают под среднее значение и отображают имя. Я не знаю, как объединить два массива, чтобы он узнал, что эта оценка связана с этим именем, поэтому отобразите это имя.Объедините два массива разных типов данных

+1

Создайте класс 'Person', состоящий из имени и оценки !? И тогда создайте только массив Person – luk2302

+1

. Вы очень многое поняли. Вам не нужно фактически объединять 2 массива, просто поймите, что одни и те же индексы в 2 массивах соответствуют одному и тому же человеку. Поэтому имяArray [4] и scoreArray [4] соответствуют одному и тому же человеку. – Siddhartha

+0

Или используйте «Map », где ключ - это имя и значение оценки. Но это менее масштабируемо, если позже вы захотите добавить третью информацию. –

ответ

1

Вы можете использовать (добавить это после того, как ваш первый цикл):

for (int i = 0; i < classSize; i++) 
    { 
     if(scoreArray[i] < average) { 
      System.out.println(nameArray[i]) 
     } 
    } 

Или, если вы хотите все это на одной строке:

System.out.println("The following students are below average: ") 
boolean first = true; 
for (int i = 0; i < classSize; i++) 
    { 
     if(scoreArray[i] < average) { 
      if(!first) { 
       System.out.println(", "); 
       first = false; 
      } 
      System.out.print(nameArray[i]) 
     } 
    } 

Кроме того, вы должны переместить линию average = sum/classSize; вне вашей петле, нет смысла пересчитывать среднее значение каждый раз.


Чтобы узнать максимальное значение, сохранить временную переменную для имени, а другой для самого высокого значения, и проходное студентов:

String highestName = ""; 
double highestValue = 0; 
for (int i = 0; i < classSize; i++) { 
    if(scoreArray[i] > highestValue) { 
     highestName = nameArray[i]; 
     highestValue = scoreArray[i]; 
    } 
} 
System.out.println(highestName + " has the highest grade.") 

Или использовать для печати более одного студента если есть связь:

String[] highestNames = new String[classSize]; 
int numHighest = 0; 
double highestValue = 0; 
for (int i = 0; i < classSize; i++) { 
    if(scoreArray[i] > highestValue) { 
     highestNames[0] = nameArray[i]; 
     numHighest = 1; 
     highestValue = scoreArray[i]; 
    } else if(scoreArray[i] > highestValue) { 
     highestNames[numHighest] = nameArray[i]; 
     numHighest = numHighest + 1; 
    } 
} 

System.out.println("The following student(s) has/have the highest grade: ") 
boolean first2 = true; 
for (int i = 0; i < numHighest; i++) 
    { 
     if(!first2) { 
      System.out.println(", "); 
      first2 = false; 
     } 
     System.out.print(highestNames[i]) 
     } 
    } 

Вы можете также объединить содержимое цикла для печати студентов град ниже среднего, с тем, чтобы найти самые высокие оценки, чтобы сделать вашу программу более эффективной:

String[] highestNames = new String[classSize]; 
int numHighest = 0; 
double highestValue = 0; 
System.out.println("The following students are below average: ") 
boolean first = true; 
for (int i = 0; i < classSize; i++) 
    { 
     if(scoreArray[i] < average) { 
      if(!first) { 
       System.out.println(", "); 
       first = false; 
      } 
      System.out.print(nameArray[i]) 
     } 
     if(scoreArray[i] > highestValue) { 
      highestNames[0] = nameArray[i]; 
      numHighest = 1; 
      highestValue = scoreArray[i]; 
     } else if(scoreArray[i] > highestValue) { 
      highestNames[numHighest] = nameArray[i]; 
      numHighest = numHighest + 1; 
     } 
    } 
+0

Могу ли я спросить, почему вы ввели логическое значение. Извините, новичок, и все еще изучаю все, что могу. Я нашел этот самый простой метод, но задавался вопросом, будет ли это работать, если вы не учли это и второе утверждение if? – Andy465

+0

также мне нужно перечислить имена, которые получили max, если вы знаете, как я мог бы найти max, который был бы блестящим. – Andy465

+0

Andy465: сначала логическое значение - это то, что запятая не добавляется перед первым элементом в списке. – Runemoro

5

Я думаю, что лучшим вариантом является создание POJO с двумя полями (имя и оценка) и создать массив него:

public class Student { 
    private String name; 
    private int score; 

    public Student(String name, int score) {  
     this.name = name; 
     this.score = score; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getScore() { 
     return score; 
    } 
} 
+0

Я не знаю, было ли это предназначено, но мне нравится факт, что экземпляры будут неизменными. И так как «нам» все нравится избегать obivous кода, как реализация «equals», 'hashCode' и' toString', можно подумать об использовании Googles [AutoValue] (https://docs.google.com/presentation/d/ 14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE) для создания таких классов. – Tom

2

Вы можете просто перебирать двух массивов вместе в одной итерации и заполнить массив пользовательского типа, содержащий строку и двойную. (Т.е. класс Student)

public class Student { 
    public String name; 
    public double score; 
    public Student(String name, double score) { 
     this.name = name; 
     this.score = score; 
    } 
} 

List<Student> students = new ArrayList<Student>(); 

for (int x = 0; x < classSize; x++) 
{ 
    input.nextLine(); 
    System.out.print("Student " + counterName++ + " Name: "); 
    nameArray[x] = input.nextLine(); 
    System.out.print("Student " + counterScore++ + " Score: "); 
    scoreArray[x] = input.nextInt(); 

    sum = sum + scoreArray[x]; 
    average = sum/classSize; 

    // populate array of student 
    students.add(new Student(nameArray[x], scoreArray[x])); 
} 

Обратите внимание, что в этом случае вам не нужно иметь scoreArray и nameArray больше для более эффективного использования памяти.

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