对String形式的Student数据进行排序

时间:2016-07-28 14:46:37

标签: java string sorting

我正在尝试编写程序来对学生数据进行排序,这是以String形式。

学生数据(String)由用户以空格分隔输入。

输入数据格式为"Name,Age,marks1,marks2"

根据总分数按降序对数据进行排序。

如果String str="Rahul,22,67,87 Uma,23,89,90 Vinay,21,78,90";

然后输出应为Uma,23,89,90 Vinay,21,78,90 Rahul,22,67,87

我已经编写了这个程序,但是在NumberFormatException中出现了。有人可以帮我理解我在哪里弄错了吗?

public static void main(String[] args) `enter code here`
{
    Scanner scan=new Scanner(System.in);
    //System.out.println("ENter String with separaed by space : ");
    //String str=scan.nextLine();
    String str="abc,12,98,56 def,23,77,88";
    String [] data=str.split(" ");
    for(int i=0; i<data.length; i++)
    {
        System.out.println("After split "+data[i]);
    }
    SortingStudent ss=new SortingStudent();
    ss.getArranged(data);
}

void getArranged(String[] metadata)
{
    for(int i=0; i<metadata.length; i++)
    {
        Integer sum=0;
        System.out.println("After passing to method "+metadata[i]);
        String s=metadata[i];
        String data[]=s.split(",");
        for(int j=0; j<data.length; j++)
        {
            System.out.println("After split 1 string "+data[j]);
            sum = sum + (Integer.parseInt(data[j]));

            System.out.println("sum= "+sum);
            j = j + 3;
        }
        sum=0;
    }
}

1 个答案:

答案 0 :(得分:0)

以下代码应该实现您的目标。

这个想法是;将输入分成<spaces>以提取每个学生记录。将其作为学生元数据传递给getArranged()方法。在此方法中,使用TreeMap将按总商标的降序排序的学生数据存储为键,将元数据存储为值。其余代码是不言自明的

<强>方法-1:

import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

public class SortingStudent {

    public static void main(String[] args) {
        //input string. You may Scanner and take user input from command line
        String str = "Rahul,22,67,87 Uma,23,89,90 Vinay,21,78,90";
        System.out.println("Input is : " + str);

        //extracting each student record - which are separated by <space>
        String[] data = str.split(" ");
        SortingStudent ss = new SortingStudent();
        System.out.println("Output is : " + ss.getArranged(data));
    }

    String getArranged(String[] metadata) {
        //Map to store student data sorted, based on total marks
        Map<Integer, String> studentData = new TreeMap<Integer, String>(Collections.reverseOrder());
        //Use Collections.reverseOrder() to sort the total marks in descending order

        //iterate through each student record
        for (int i = 0; i < metadata.length; i++) {
            Integer sum = 0;
            String s = metadata[i];
            //Extract student marks
            String data[] = s.split(",");
            //find the total marks
            for (int j = 2; j < data.length; j++) {
                sum = sum + (Integer.parseInt(data[j]));
            }
            studentData.put(sum, s);
        }

        //construct the result
        StringBuffer result = new StringBuffer();
        for (Map.Entry<Integer, String> map : studentData.entrySet()) {
            result.append(map.getValue() + " ");
        }
        return result.toString().trim();
    }

}

但是,如果你真的想要实现这一点,那就利用Java的面向对象特性和集合框架;以下代码是其中一种方法

<强>方法-2:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class SortingStudent {

    public static void main(String[] args) {
        //input string. You may Scanner and take user input from command line
        String str = "Rahul,22,67,87 Uma,23,89,90 Vinay,21,78,90";
        System.out.println("Input is : " + str);
        //extracting each student record - which are separated by <space>
        String[] data = str.split(" ");
        SortingStudent ss = new SortingStudent();
        System.out.print("Output is :");
        for(Student s : ss.getArranged(data)) {
            System.out.print(" " + s);
        }
    }

    private Set<Student> getArranged(String[] metadata) {
        //Set to store student data sorted, based on total marks
        Set<Student> studentData = new TreeSet<Student>(Collections.reverseOrder());
        //Use Collections.reverseOrder() to sort the total marks in descending order

        //iterate through each student record
        for (int i = 0; i < metadata.length; i++) {
            String s = metadata[i];
            String data[] = s.split(",");
            Student student = new Student();
            student.setName(data[0]);
            student.setAge(Integer.parseInt(data[1]));
            for (int j = 2; j < data.length; j++) {
                student.addMarks(Integer.parseInt(data[j]));
            }
            studentData.add(student);
        }
//        System.out.println(studentData);
        return studentData;
    }

}

class Student implements Comparable<Student> {
    private String name;
    private int age;
    private List<Integer> marks;

    public Student() {
        marks = new ArrayList<Integer>();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Integer> getMarks() {
        return marks;
    }

    public void setMarks(List<Integer> marks) {
        this.marks = marks;
    }

    public void addMarks(int marks) {
        this.marks.add(marks);
    }

    public int getTotalMarks() {
        int totalMarks = 0;
        for(int marks : marks)
            totalMarks += marks;
        return totalMarks;
    }

    @Override
    public int compareTo(Student otherStudent) {
        return Integer.compare(this.getTotalMarks(), otherStudent.getTotalMarks());
    }

    @Override
    public String toString() {
        StringBuffer content = new StringBuffer();
        content.append(name);
        content.append(",");
        content.append(age);
        content.append(",");
        int i = 0;
        for(; i < marks.size()-1; i++)
            content.append(marks.get(i)+",");
        content.append(marks.get(i));
        return content.toString();
    }
}