2017-07-19 4 views
-3

- J'utilise .stream() pour filtrer une liste par nom initial choisi par l'utilisateur et l'imprimer, mais je ne peux pas obtenir la liste triée pour imprimer correctement; il imprime seulement des espaces blancs. Je pense que ça ne sauvegarde pas correctement le tri dans la liste. Comment puis-je réparer cela?Java .stream() ne pas enregistrer Liste <> trier dans .toList() - affiche

StudentFinder.java:

import java.util.*; 
    import java.util.stream.*; //throws error w/o it :(

    public class StudentFinder { 

     //Print method 
      public static void contactPrint(List<Student> arr) { 
       for(int x = 0; x < arr.size(); ++x) { 
        System.out.println("[" + x + "]" + " Name: " + arr.get(x).name + " - ID: " + arr.get(x).id + " - GPA: " + arr.get(x).gpa); 
       }// end for loop 
      }// end contactPrint() 

     public static void main(String[] args) {     

      // "File" to hold Student's field 'name' info 
      String[] names = { 
        "Albert Einstein", 
        "Ada Lovelace", 
        "Blaise Pascal", 
        "Bruna Louise", 
        "Caroline Herschel", 
        "Cecilia Payne-Gaposchkin", 
        "Dorothy Hodgkin", 
        "Douglas Junior", 
        "Edwin Powell Hubble", 
        "Elizabeth Blackburn", 
        "Flossie Wong-Staal", 
        "Frieda Robscheit-Robbins", 
        "Geraldine Seydoux", 
        "Gertrude B. Elion", 
        "Ingrid Daubechies", 
        "Irma Sanchez", 
        "Jacqueline K. Barton", 
        "Johannes Kepler", 
        "Lene Vestergaard Hau", 
        "Lord Kelvin", 
        "Maria Mitchell", 
        "Max Planck", 
        "Nicolaus Copernicus", 
        "Niels Bohr", 
        "Patricia S. Goldman-Rakic", 
        "Patty Jo Watson", 
        "Richard Phillips Feynman", 
        "Rita Levi-Montalcini", 
        "Sarah Boysen", 
        "Stephen Hawking", 
        "Werner Karl Heisenberg", 
        "Wilhelm Conrad Roentgen" 
      }; 

      int numStudents = names.length; 
      String holdUserInput; 

      //Create new Student object students 
      List<Student> students = new ArrayList<Student>(); 

      // Initialize List of objects Student students with **CONSTRUCTOR** 
      for(int x = 0; x < numStudents; ++x) { 
       students.add(new Student(names[x], (100 + x), (double)((2.2 + (x + 2))))); // constructor 
      } 

      //Prints original object students 
      contactPrint(students); 

      //prompt user for input 
      System.out.println("Enter the first letter of the student's name:"); 
      Scanner userInput = new Scanner(System.in); 
      holdUserInput = userInput.nextLine();//<<<******INT??? String???******** 

      //handle user's input 
      List<String> studentsNames = 
        students.stream() 
            .filter(n -> n.getName().startsWith(holdUserInput.toUpperCase())) 
            .sorted(Comparator.comparing(Student::getName)) 
            .map(Student::getName) 
            .collect(Collectors.toList()); 

      //print sorted list 
      System.out.println(" \n"); 
      for(int i = 0; i < studentsNames.size(); i++) { 
       System.out.println(studentsNames.get(i)); 
      } 

      //end program message to user 
      System.out.println("Program Ended."); 

     }// end main() 
}// end class StudentFinder 

Student.java:

public class Student { 

    String name = ""; 
    int id; 
    double gpa; 

    // constructor 
    public Student(String sName, int sId, double sGpa) { 
     name = sName; 
     id = sId; 
     gpa = sGpa; 

    } 

    //get name value to main() 
    public String getName() { 
     return name; 

    } 

    //get ID value to main() 
    public int getId() { 
     return id; 

    } 

    //get GPA value to main() 
     public double getGpa() { 
      return gpa; 

     } 
} 
+5

Sans savoir ce que 'étudiant s' ou 'holdUserInput' sont, nous ne pouvons pas reproduire cela, et donc nous ne pouvons pas conseiller ce qui ne va pas. –

+1

Veuillez fournir un [mcve] qui illustre votre problème. – azurefrog

+0

Voici mon code complet: [link] (https://gist.github.com/lelecarabina/328fe78608594ceb07fff3c53dfd3e92) –

Répondre

0

Je ne pense pas que votre problème vient du tri ... Le code suivant qui est probablement très semblable à ce que vous avez sans classe intérieure semble fonctionner. Donnez-nous plus de détails sur le reste du code et nous serons peut-être en mesure d'aider.

import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.List; 
import java.util.Scanner; 
import java.util.stream.Collectors; 

public class SortTest 
{ 
    public static class Student 
    { 
     String string; 
     public Student(String s) { this.string = s; } 
     public String getName() { return this.string; } 
    } 

    public static void main(String[] args) 
    { 
     List<Student> students = new ArrayList<Student>(); 
     students.add(new Student("AA")); 
     students.add(new Student("AC")); 
     students.add(new Student("AB")); 
     students.add(new Student("BA")); 

     System.out.println("Initial Order of all students: "); 
     for(Student student : students) { System.out.print(student.getName() + " "); } 

     System.out.print("\nPick your letter: "); 
     Scanner scanner = new Scanner(System.in); 
     String letter = scanner.next(); 
     scanner.close(); 

     List<String> studentNames = students.stream() 
     .filter(n -> n.getName().toUpperCase().startsWith(letter.toUpperCase())) 
     .sorted(Comparator.comparing(Student::getName)) 
     .map(Student::getName) 
     .collect(Collectors.toList()); 

     System.out.println("\nNew order of names starting by " + letter + ":"); 
     for(String name : studentNames) { System.out.print(name + " "); } 
    } 
} 

sortie est:

Commande initiale de tous les élèves: AA AC AB BA

Choisissez le votre lettre: un

Nouvel ordre des noms commençant par A: AA AC AB

+0

Au lieu de '.sorted (Comparator.comparing (Student :: getName)) .map (Student :: getName) ', vous pouvez simplement utiliser' .map (Student :: getName) .sorted() ' – Holger

+0

@Holger Je viens d'essayer ça; ça n'a pas marché. Il est tellement bizarre. Il imprime deux lignes vides, le nombre de noms commençant par chaque lettre choisie, mais il n'imprime pas les noms ... :( –

+0

@Maaaatt J'essaie d'imprimer une liste de noms qui commencent par la lettre choisie, pas la lettre elle-même :) –