Java .stream() не сохраняет сортировку List<> в.toList() - печатает пустым
-- Я использую .stream()
отфильтровать список по первоначальному имени, выбранному пользователем, и распечатать его, но я не могу получить отсортированный список для правильной печати; это только печатает пробел. Я думаю, что это не сохраняет сортировку правильно в списке. Как я могу это исправить?
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;
}
}
1 ответ
Решение
Я не думаю, что ваша проблема связана с сортировкой... Кажется, работает следующий код, который, вероятно, очень похож на тот, который у вас есть без внутреннего класса. Дайте нам более подробную информацию об остальной части кода, и мы сможем помочь.
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 + " "); }
}
}
Выход:
Первоначальный порядок всех студентов: AA AC AB BA
Выберите свое письмо:
Новый порядок имен, начинающийся с A: AA AC AB