如何将 ArrayList 转换为具有有序元素的 String 数组?
How to convert an ArrayList to String array with ordered elements?
我正在尝试编写一个方法,该方法将采用 Student 对象的 ArrayList 和 return 我是一个字符串数组,其中包含按分数顺序排列的学生姓名(得分最高的学生姓名将是在索引 0).
public static void orderStudent(List<Student> ls) {
for (Student stu : ls) {
System.out.println("Name: " + stu.getName() + ", Score: "
+ stu.getScore());
}
}
上面的代码片段在执行时会打印类似
的内容
Name: Alex, Score: 10.35
Name: Bob, Score: 11.2
Name: Charles, Score: 8.22
我希望 orderStudent 方法 return 一个包含内容 [Bob, Alex, Charles] 的字符串数组,Bob 是得分王,其次是 Alex 和 Charles。
如果 Student
实现了 Comparable
接口并按分数排序,那么您只需对列表进行排序,然后构建您的姓名数组。
如果你不能编辑 Student
class,你需要写一个 class 来实现 Comparator<Student>
并用它来排序列表然后构建你的名字数组。
简化@PrasadKhode 的回答:
public static String[] orderStudent(List<Student> list) {
String[] students = new String[list.size()];
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student object1, Student object2) {
return Integer.compare(object2.getScore(), object1.getScore());
}
});
for (int index = 0; index < list.size(); index++) {
Student student = list.get(index);
students[index] = student.getName();
System.out.println("Name: " + student.getName());
}
return students;
}
无需为每个分数比较创建 CompareToBuilder
实例。那是低效的。
- 您需要在 Student 对象中定义一些字符串序列化(可选)
您需要使用按分数排序的自定义比较器对您的对象进行排序(必需)
Collections.sort(列表列表,比较器 c)
- 列表是您的列表
- c 是比较器
遍历排序后的集合并打印
您需要在 Student
Class 中实现两件事:Comparable
,以及对 .toString()
方法的覆盖。首先,定义你的学生 class 喜欢:
public class Student implements Comparable<Student>
那么你必须定义.compareTo()
方法如下:
//used for sorting later
public int compareTo(Student other) {
return this.getScore().compareTo(other.getScore());//Assuming Student.score is not a primitive type
}
同样覆盖.toString()
方法如下:
//used for printing later
public string toString() {
return "Name: " + this.getName() + ", Score: " + this.getScore().toString();
}
现在您只需将 orderStudents
函数更改为以下内容:
public static void orderStudent(List<Student> ls) {
// this will sort your collection based on the logic in the `Student.compareTo()` method.
ls = Collections.sort(ls);
for (Student stu : ls) {
//this will print the student object based on the `Student.toString()` method
System.out.println(stu);
}
}
用列表替换数组:
public static List<String> orderStudent(List<Student> ls) {
Collections.sort(ls, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getScore().compareTo(o1.getScore());
}
});
List<String> result = new ArrayList<String>();
for(Student s : ls) {
result.add(s.getName());
}
return result;
}
如果使用Java 8 将少于两行...
首先你需要对你的List进行排序然后你需要构造String[]
您可以使用 CompareToBuilder
class 而无需对现有 POJO class 进行任何更改。
在 CompareToBuilder 上,您需要添加 属性 您需要对其进行排序的集合。你可以看到下面的代码:
import org.apache.commons.lang3.builder.CompareToBuilder;
...
public static String[] orderStudent(List<Student> list) {
String[] students = new String[list.size()];
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student object1, Student object2) {
return new CompareToBuilder().append(object2.getScore(), object1.getScore()).toComparison();
}
});
for (int index = 0; index < list.size(); index++) {
Student student = list.get(index);
students[index] = student.getName();
System.out.println("Name: " + student.getName());
}
return students;
}
我正在尝试编写一个方法,该方法将采用 Student 对象的 ArrayList 和 return 我是一个字符串数组,其中包含按分数顺序排列的学生姓名(得分最高的学生姓名将是在索引 0).
public static void orderStudent(List<Student> ls) {
for (Student stu : ls) {
System.out.println("Name: " + stu.getName() + ", Score: "
+ stu.getScore());
}
}
上面的代码片段在执行时会打印类似
的内容Name: Alex, Score: 10.35
Name: Bob, Score: 11.2
Name: Charles, Score: 8.22
我希望 orderStudent 方法 return 一个包含内容 [Bob, Alex, Charles] 的字符串数组,Bob 是得分王,其次是 Alex 和 Charles。
如果 Student
实现了 Comparable
接口并按分数排序,那么您只需对列表进行排序,然后构建您的姓名数组。
如果你不能编辑 Student
class,你需要写一个 class 来实现 Comparator<Student>
并用它来排序列表然后构建你的名字数组。
简化@PrasadKhode 的回答:
public static String[] orderStudent(List<Student> list) {
String[] students = new String[list.size()];
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student object1, Student object2) {
return Integer.compare(object2.getScore(), object1.getScore());
}
});
for (int index = 0; index < list.size(); index++) {
Student student = list.get(index);
students[index] = student.getName();
System.out.println("Name: " + student.getName());
}
return students;
}
无需为每个分数比较创建 CompareToBuilder
实例。那是低效的。
- 您需要在 Student 对象中定义一些字符串序列化(可选)
您需要使用按分数排序的自定义比较器对您的对象进行排序(必需)
Collections.sort(列表列表,比较器 c)
- 列表是您的列表
- c 是比较器
遍历排序后的集合并打印
您需要在 Student
Class 中实现两件事:Comparable
,以及对 .toString()
方法的覆盖。首先,定义你的学生 class 喜欢:
public class Student implements Comparable<Student>
那么你必须定义.compareTo()
方法如下:
//used for sorting later
public int compareTo(Student other) {
return this.getScore().compareTo(other.getScore());//Assuming Student.score is not a primitive type
}
同样覆盖.toString()
方法如下:
//used for printing later
public string toString() {
return "Name: " + this.getName() + ", Score: " + this.getScore().toString();
}
现在您只需将 orderStudents
函数更改为以下内容:
public static void orderStudent(List<Student> ls) {
// this will sort your collection based on the logic in the `Student.compareTo()` method.
ls = Collections.sort(ls);
for (Student stu : ls) {
//this will print the student object based on the `Student.toString()` method
System.out.println(stu);
}
}
用列表替换数组:
public static List<String> orderStudent(List<Student> ls) {
Collections.sort(ls, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getScore().compareTo(o1.getScore());
}
});
List<String> result = new ArrayList<String>();
for(Student s : ls) {
result.add(s.getName());
}
return result;
}
如果使用Java 8 将少于两行...
首先你需要对你的List进行排序然后你需要构造String[]
您可以使用 CompareToBuilder
class 而无需对现有 POJO class 进行任何更改。
在 CompareToBuilder 上,您需要添加 属性 您需要对其进行排序的集合。你可以看到下面的代码:
import org.apache.commons.lang3.builder.CompareToBuilder;
...
public static String[] orderStudent(List<Student> list) {
String[] students = new String[list.size()];
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student object1, Student object2) {
return new CompareToBuilder().append(object2.getScore(), object1.getScore()).toComparison();
}
});
for (int index = 0; index < list.size(); index++) {
Student student = list.get(index);
students[index] = student.getName();
System.out.println("Name: " + student.getName());
}
return students;
}