2014-05-16 60 views
0

我想確定一個數組的最大標記,其中包含學生的教室名稱和他們的標記。要做到這一點,我有一個像Person這樣的超類,它包含getName(),Max()print()抽象方法,不應該改變。請幫助我從這個超類繼承

我有一個名爲Student的子類,它應該從Person超類擴展而來。這個小類應該保存學生的信息,並獲得教室的最大標記,然後打印出來。主要的班級名稱是Points。我使用了一個散列表來存儲標記的值。我怎樣才能在Max()方法中使用這個值,以及如何使用Print()方法來顯示最大分數和學生姓名。謝謝。

這是我寫的。

Person超:

public abstract class Person { 
private String name; 

Person(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public abstract void Max(); 

public abstract void Print(); 

} 

Student子類:

import java.util.*; 

public class Student extends Person { 
Map<String, Integer> scores = new HashMap<>(); 

Student(String name) { 
    super(name); 
    String[] bits = name.trim().split(" "); 
    for (int i = 0; i < bits.length; i++) { 
     int Marks = Integer.parseInt(bits[1]); 
     scores.put(bits[0], Marks); 
    } 
} 

@Override 
public void Max() { 

} 

@Override 
public void Print() { 

} 

} 

Points主類:

public class Points { 

public static void main(String[] args) { 

    String[] Marks = new String[] { "Student1 12", 
      "Student2 90", 
      "Student3 45", 
      "Student4 76", 
      "Student5 58", }; 
    for (int i = 0; i < Marks.length; i++) { 
     Student std = new Student(Marks[i]); 
     std.getName(); 
     std.Max(); 
     std.Print(); 
    } 
} 

} 

回答

0

通過繼承的概念,你在說什麼這裏是:

每個Student,是一個Person。還行吧。

但是,每個Person,只能訪問自己的數據,而不是其他人的數據,包括名稱,得分& ......。它只能訪問自己的數據。

在您的Points主類的定義中,您將數組Marks填入學生信息中,因此Points類可以訪問所有學生。因此,理想的是實現處理多個對象的方法,在維護所有對象的類中。

兩個小技巧在這裏:

  • 你真的不需要一個HashMapStudent類。每個Student只存儲自己的名字和分數,而不是所有學生的名字和分數。 HashMap用於存儲多個相同類型的值,但具有不同的指示符,因此您可以輕鬆找到一個值。

  • 儘量使main方法儘可能短。例如,您可以使用run()方法創建類Program,並且只在main方法中實例化該類並調用其run()方法。

+0

據說你應該使用hashmap來做到這一點。我只是不知道如何重寫'Print()'和'Max()'方法並調用它們。我是超級新手。 – user3637733

+0

我想如果代碼中有一個必須使用'HashMap'的地方,它應該只是'Points'類,而不是'Marks'數組。 您應該在主類中實現'Max()'和'Print()'方法。然而,如果你爲你的程序製作了一個驅動程序類,那將是最好的。 事實上,我在程序中看不到任何繼承的需要。你可以讓「Student」這個類繼續,然後把所有的記錄保存在一個驅動對象中。有更好的例子使用繼承: 例如,看一些RPG遊戲。你會立即認識到繼承的用途。 –

0

更改下面的Point類,調用max,print for循環外的方法。

寫入最大值和打印方法的邏輯。內部最大值方法直接使用散列圖來檢索最大值。

另外,您還要爲每個創建的對象創建hashmap,因此每個名稱都會創建新的hashmap,因此您將始終從max方法獲取姓氏。

所以要HashMap的靜態內部類學生像下面

static Map<String, Integer> scores = new HashMap<>(); 

見下文

整個代碼Person.java

package com.kb.studentMaxMarks; 

import java.util.Map.Entry; 

public abstract class Person { 
private String name; 

public Person() { 
    // TODO Auto-generated constructor stub 
} 
Person(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public abstract Entry<String, Integer> Max(); 

public abstract void Print(Entry<String, Integer> entry); 

} 

Student.java

package com.kb.studentMaxMarks; 

import java.util.*; 
import java.util.Map.Entry; 

public class Student extends Person { 
static Map<String, Integer> scores = new HashMap<>(); 

Student(String name) { 
    super(name); 
    String[] bits = name.trim().split(" "); 
    for (int i = 0; i < bits.length; i++) { 
     int marks = Integer.parseInt(bits[1]); 
     // System.out.println(marks); 
     scores.put(bits[0], marks); 
    } 
} 

@Override 
public Entry<String, Integer> Max() { 
    System.out.println("inside max"); 

    Map.Entry<String,Integer> maxEntry = null; 
    //System.out.println(" max value of map "+maxValueInMap); 
    for (Map.Entry<String,Integer> entry : scores.entrySet()) { 
     if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) 
      { 
       maxEntry = entry; 
      } 
    } 
    //System.out.println(maxEntry.getValue()); 
    return maxEntry; 

} 

@Override 
public void Print(Entry<String, Integer> entry) { 
    System.out.println("name "+entry.getKey()+" score "+entry.getValue()); 

} 

} 

Points.java

package com.kb.studentMaxMarks; 

import java.util.Map.Entry; 

public class Points { 

public static void main(String[] args) { 
    String[] Marks = new String[] { "Student1 12", 
      "Student2 90", 
      "Student3 45", 
      "Student4 76", 
      "Student5 58", }; 
    Student std = null; 
    for (int i = 0; i < Marks.length; i++) { 
     std = new Student(Marks[i]); 
     std.getName(); 
    } 
    Entry<String, Integer> entry = std.Max(); 
    std.Print(entry); 
} 

} 

讓我知道任何問題。

+0

謝謝。現在,我不知道如何來覆蓋例如最大方法時,我寫這篇文章的代碼我只得到了最後一個學生的分數:'@覆蓋 \t公共無效MAX(){ \t \t \t的System.out.println(scores.values ()); \t}' – user3637733

+0

max應該工作以返回最大分數的學生的細節只是正確的?你能否顯示你用什麼邏輯找到最大值 –

+0

查看更新後的答案,以使地圖在學生課堂內爲靜態。 –