我正在尝试编写程序来对学生数据进行排序,这是以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;
}
}
答案 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();
}
}