2014-01-18 152 views
-2

我有一個功課,經過很多努力後,我沒有成功解決它,所以我問它在這裏,問題是:我們有一個學生名單和他們的成績在一個字符串中。學號,名字,姓氏,課程名稱,年級,然後用「;」分隔然後另一個學生的記錄,所以字符串是這樣的:需要關於java編程的幫助

75414133,Mehdi,Javan,Math,16; 88887777,Shadi,Khani,英語,18; 75414133,Mehdi,Javan,英語,12; 88887777,Shadi,Khani,Physiques,16; 512345678,Mohamad,Sayadi,Chemistry,15; 88887777,Shadi,Khani,Math,15;

我們需要一個java程序來計算等級的平均值,並且用他們的成績記錄類的名字(等級必須是升序)。我們必須使用List和map來實現這個代碼。失認沽應該是這樣的:

75414133,邁赫迪,爪哇:

Average: 14 

English: 12 

Math: 16 

88887777,沙迪,哈尼:

Average: 16.5 

Math: 15 

Physiques: 16.5 

English: 18 

對不起傢伙,我盡我所能。但我沒有成功解決它。任何幫助表示讚賞。

編輯:這裏是未完成的代碼,我寫了,這是錯誤的,但因爲我是問到這裏的一些用戶,我寫我錯了代碼寫在這裏:

public class Average 
{ 
    public static void main(String args[]){ 
     String str ="75414133,Mehdi,Javan,Math,16;88887777,Shadi,Khani,English,18;12345678,Mohamad,Sayadi,Chemistry,15;75414133,Mehdi,Javan,English,12;88887777,Shadi,Khani,Math,15;88887777,Shadi,Khani,Physiques,16.5;12345678,Mohamad,Sayadi,Sport,17.25;75414133,Mehdi,Javan,English,12;12345678,Mohamad,Sayadi,Islamic Revolution,8"; 
     String[] strRecords = str.split(";"); 

     for(int i=0;i<strRecords.length;i++){ 
      String[] strColon= strRecords[i].split(","); 

      for (int j=1;j<strRecords.length;j++){ 
       if(Integer.valueOf(strRecords[i].substring(0,8)) ==Integer.valueOf(strRecords[j].substring(0,8))){ 
        String strName = strColon[0] + "," + strColon[1]+"," +strColon[2]; 
        System.out.println(strName); 
       } 
      } 
     } 
    } 
} 
+3

您必須出示在奧德代碼r我們幫助你,否則我們會失明。你到目前爲止嘗試了什麼? – zero298

+0

好的,我會編輯第一篇文章,並寫我嘗試的代碼(儘管)它沒有寫得很好,是錯誤的,但我會。 –

+0

請正確縮進您的代碼。另外,你的代碼有什麼問題?它以什麼方式不做你想要的? – Keppil

回答

4

這裏是你想要

public class StudentMain 
{ 
    public static void main(String args[]) throws JAXBException 
    { 
     String input = "75414133,Mehdi,Javan,Math,16; 88887777,Shadi,Khani,English,18; 75414133,Mehdi,Javan,English,12; 88887777,Shadi,Khani,Physiques,16; 512345678,Mohamad,Sayadi,Chemistry,15; 88887777,Shadi,Khani,Math,15;"; 

     String[] studentRecords = input.split(";"); 

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

     for (String studentRecord : studentRecords) 
     { 
      String[] studentData = studentRecord.split(","); 

      Student student = new Student(studentData[0], studentData[1], studentData[2]); 

      if (students.contains(student)) 
      { 
       student = students.get(students.indexOf(student)); 

       student.addScore(studentData[3], Integer.valueOf(studentData[4])); 
      } 
      else 
      { 
       student.addScore(studentData[3], Integer.valueOf(studentData[4]));     
       students.add(student); 
      } 
     } 

     for (Student student : students) 
     { 
      student.printScoreCard(); 
     } 
    } 
} 

class Student 
{ 
    private String number; 
    private String firstName; 
    private String lastName; 

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

    public Student(String number, String firstName, String lastName) 
    { 
     this.number = number.trim(); 
     this.firstName = firstName.trim(); 
     this.lastName = lastName.trim(); 
    } 

    public void addScore(String subject, Integer score) 
    { 
     this.scores.put(subject, score); 
    } 

    public void printScoreCard() 
    { 
     System.out.println(); 
     System.out.println(number + "," + firstName + "," + lastName + ":"); 
     System.out.println("Average: " + getAverageScore()); 

     for (Entry<String, Integer> score : scores.entrySet()) 
     { 
      System.out.println(score.getKey() + ": " + score.getValue()); 
     } 

     System.out.println(); 
    } 

    private double getAverageScore() 
    { 
     double average = 0.0; 

     for (Entry<String, Integer> score : scores.entrySet()) 
     { 
      average = average + score.getValue(); 
     } 

     average = average/scores.size(); 
     return average; 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     if (o == null || !(o instanceof Student)) 
     { 
      return false; 
     } 

     Student compareTo = (Student) o; 

     return number.equals(compareTo.number); 
    } 
} 
+0

非常感謝你的幫助 –

0

可以使用字符串解析你的字符串.split()方法。像 yourString.split(":")將所有學生分開。然後你可以做string.split(「,」)來提取每個學生的所有屬性。你可以製作一個學生課程並製作具有基本屬性的對象。

+0

感謝您的回覆,但代碼應該按「;」分隔不是「:」你提到。請你用編程語言編寫你的意思,我需要幫助實現地圖和列表有問題的地方,謝謝 –

0

雖然SANKET的答案是安靜好了,我想發佈另一個答案具有更高的性能是什麼。一些顯着的點是:

  • 該算法的順序必須爲O(n),從而代替使用ArrayList存儲學生使用HashMap由於ArrayListcontains方法使用循環來找到對象及其順序是O(n),而通過其在HashMap中的鍵找到條目的順序是O(1)。
  • 收集容量應該初始化。處理大量對象時會影響性能。
  • 爲了解決這個問題,沒有必要使用Map來存儲分數的數據,而簡單的List就足夠了。

下面是答案:

主要類:

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) { 
     String input = "75414133,Mehdi,Javan,Math,16;88887777,Shadi,Khani,English,18;12345678,Mohamad,Sayadi,Chemistry,15;75414133,Mehdi,Javan,English,12; 88887777,Shadi,Khani,Math,15;88887777,Shadi,Khani,Physiques,16.5;12345678,Mohamad,Sayadi,Sport,17.25;12345678,Mohamad,Sayadi,Islamic Revolution,8"; 

     String[] studentRecords = input.split(";"); 
     Map<Long, Student> studentMap = new HashMap<>(studentRecords.length); 
     for (String record : studentRecords) { 
      String[] fields = record.split(","); 
      Long id = Long.valueOf(fields[0].trim()); 
      String firstName = fields[1]; 
      String lastName = fields[2]; 

      Student student = studentMap.get(id); 
      if (student == null) { 
       student = new Student(id, firstName, lastName); 
       studentMap.put(id, student); 
      } 

      String courseTitle = fields[3]; 
      Float score = Float.valueOf(fields[4]); 
      student.getCourseList().add(new Course(courseTitle, score)); 
     } 

     for (Student student : studentMap.values()) 
      student.printInfo(); 
    } 
} 

Student類:

import java.util.ArrayList; 
import java.util.List; 
import java.util.Objects; 

public class Student { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private List<Course> courseList = new ArrayList<>(); 

    public Student(Long id, String firstName, String lastName) { 
     this.id = id; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public List<Course> getCourseList() { 
     return courseList; 
    } 

    public void setCourseList(List<Course> courseList) { 
     this.courseList = courseList; 
    } 

    public void printInfo() { 
     System.out.println(id + "," + firstName + "," + lastName); 
     System.out.println(String.format("Average: %.2f", calculateAverage())); 

     for (Course course : courseList) 
      System.out.println(String.format("%s: %.2f", course.getTitle(), course.getScore())); 
    } 

    private float calculateAverage() { 
     float sum = 0; 

     for (Course course : courseList) 
      sum += course.getScore(); 

     float average = sum/(float) courseList.size(); 

     return average; 
    } 
} 

課程類:

public class Course { 
    private String title; 
    private Float score; 

    public Course(String title, Float score) { 
     this.title = title; 
     this.score = score; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public Float getScore() { 
     return score; 
    } 

    public void setScore(Float score) { 
     this.score = score; 
    } 
}