2015-10-17 68 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個數組中的相同索引對應於同一個人。所以nameArray [4]和scoreArray [4]對應於同一個人。 – Siddhartha

+0

或者使用'Map ',其中的關鍵是名稱和值的分數。但是,如果您稍後想要添加第三個信息,則這可擴展性較差。 –

回答

1

您可以使用(你的第一個循環後添加此):如果你想這一切

​​

或者在同一行:

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

您也可以結合循環的內容打印學生畢業es低於平均水平,找到最高等級以使您的程序更高效:

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

我還必須列出名字誰得到了最大,如果你知道我怎麼能找到最大的將是輝煌的 – 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

我不知道這是否是有意的,但我喜歡這個事實,即實例將是不可變的。由於「我們」都喜歡避免像equals,hashCode和toString這樣的明顯代碼,所以可以考慮使用Google [AutoValue](https://docs.google.com/presentation/d/) 14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE)庫來創建這樣的類。 – Tom

2

您可以在一個迭代通過兩個數組簡單迭代在一起,填充包含String和double的自定義類型的數組。 (即一個學生類)

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

注意,在這種情況下,你不需要有scoreArraynameArray了更好的內存利用率。

相關問題