2016-07-28 3 views
-1

Ich versuche, Programm zum Sortieren von Student-Daten zu schreiben, die in String-Form ist.Sortierung der Student-Daten, die in String-Formular ist

Studentendaten (String) werden vom Benutzer getrennt durch Leerzeichen eingegeben.

Es gibt das Eingabedatenformat "Name,Age,marks1,marks2".

Sortieren Sie die Daten in absteigender Reihenfolge basierend auf den Gesamtmarkierungen.

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

dann sollte eine Ausgabe Uma,23,89,90 Vinay,21,78,90 Rahul,22,67,87 sein

ich dieses Programm haben zu schreiben, aber landete in Number auf. Kann mir bitte jemand helfen, zu verstehen, wo ich den Fehler mache?

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

Ein Student Datenobjekt sein kann? Wie wäre es mit einer vergleichbaren Schnittstelle? Kannst du es versuchen? Viele Referenzen können für beide gefunden werden. –

+0

Möchten Sie in der zweiten Schleife in 'getArranged' nicht' data [0] 'und' data [1] 'überspringen, da das der Name und das Alter ist? Ich glaube nicht, dass du 'j = j + 3' brauchst. – Austin

+0

In einer einfachen Weise mit 'String [] Namen versuchen' Arrays.sort (Namen, absteigendComparator) ' –

Antwort

0

Der folgende Code sollte erreichen, was Sie versuchen zu tun.

Die Idee ist; Teilen Sie Ihre Eingabe durch <spaces>, um jeden Schüler-Datensatz zu extrahieren. Übergeben Sie diese als Student-Metadaten an Ihre getArranged() -Methode. Verwenden Sie in dieser Methode eine TreeMap, um die Schülerdaten in absteigender Reihenfolge der Gesamtmarkierungen als Schlüssel und die Metadaten als Wert zu speichern. Rest des Codes ist selbsterklärend

Ansatz-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(); 
    } 

} 

Allerdings, wenn Sie wirklich wollen, dies zu erreichen, Java Object Oriented Features und Collections Framework nutzen; folgende Code ist eine der Möglichkeiten, zu tun

Ansatz-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(); 
    } 
} 
+0

Thanku alle für Ihre Antwort .... Ich habe meinen Fehler verstanden. –

+0

Ashwini, können Sie diese Antwort akzeptieren, wenn die Lösung für Sie arbeitet, so dass es anderen in Zukunft helfen kann. – JavaHopper

Verwandte Themen