如何将 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 实例。那是低效的。

  1. 您需要在 Student 对象中定义一些字符串序列化(可选)
  2. 您需要使用按分数排序的自定义比较器对您的对象进行排序(必需)

    Collections.sort(列表列表,比较器 c)

    • 列表是您的列表
    • c 是比较器
  3. 遍历排序后的集合并打印

您需要在 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;
}