-- I'm using .stream()
to filter a List by name initial chosen by the user and print it out, but I can't get the sorted list to print correctly; it only prints white space. I think it's not saving the sorting correctly in the list. How can I fix this?
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;
}
}
I don't think your problem comes from the sorting... The following code which is probably very similar to what you have without the inner class seems to work. Give us more details about the rest of the code and we may be able to help.
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 + " "); }
}
}
Output is:
Initial order of all students: AA AC AB BA
Pick your letter: a
New order of names starting by A: AA AC AB