Во-первых, поскольку вы используете Java, естественным способом сделать это было бы создание класса, например Student, с членами экземпляра класса grade и name. Тогда у вас будет список студентов, которых вы можете отсортировать, что, естественно, сохранит связанные данные вместе.
Однако, если вам нужно придерживаться отдельных списков, уловка состоит в том, чтобы отсортировать список индексов в списке оценок, а не в самом списке оценок. В компараторе вы сравниваете оценки на соответствующих позициях в вашем списке оценок, а не индексы.
List<String> grades = Arrays.asList("F", "A", "C", "D");
List<String> names = Arrays.asList("Tom", "Sue", "Dick", "Harry");
List<Integer> indexes = new ArrayList<>();
for(int i=0; i<grades.size(); i++) indexes.add(i);
indexes.sort((i1, i2) -> grades.get(i1).compareTo(grades.get(i2)));
for(Integer i : indexes)
System.out.format("%s : %s%n", names.get(i), grades.get(i));
List<String> sortedGrades = new ArrayList<>();
List<String> sortedNames = new ArrayList<>();
for(Integer i : indexes)
{
sortedGrades.add(grades.get(i));
sortedNames.add(names.get(i));
}
System.out.println();
System.out.println(sortedNames);
System.out.println(sortedGrades);
Вывод:
Sue : A
Dick : C
Harry : D
Tom : F
[Sue, Dick, Harry, Tom]
[A, C, D, F]
Просто для сравнения, вот как вы могли бы это сделать это с использованием класса Student:
class Student
{
String grade;
String name;
public Student(String name, String grade)
{
this.name = name;
this.grade = grade;
}
}
Test:
List<String> grades = Arrays.asList("F", "A", "C", "D");
List<String> names = Arrays.asList("Tom", "Sue", "Dick", "Harry");
List<Student> students = new ArrayList<>();
for(int i=0; i<grades.size(); i++)
students.add(new Student(names.get(i), grades.get(i)));
students.sort((s1, s2) -> s1.grade.compareTo(s2.grade));
for(Student s : students)
System.out.format("%s : %s%n", s.name, s.grade);
Вывод:
Sue : A
Dick : C
Harry : D
Tom : F