Java行转列效率优化
在Java开发中,我们经常会遇到需要将行数据转换为列数据的情况。这种转换通常涉及到对数据进行重新组织和整理,以便更好地满足业务需求。然而,由于数据量的增加和计算复杂度的提高,行转列的效率问题也逐渐凸显出来。本文将介绍一些优化行转列效率的方法,并通过代码示例来演示它们的实际应用。
问题描述
假设我们有一个包含大量学生的数据表,每个学生有姓名(name)、科目(subject)和成绩(score)三个属性。数据以行的形式存储,如下所示:
name | subject | score |
---|---|---|
Alice | Math | 90 |
Alice | English | 85 |
Bob | Math | 95 |
Bob | English | 80 |
... | ... | ... |
现在我们需要将这些数据按照科目进行转换,变成以科目为列、姓名为行的形式存储,如下所示:
name | Math | English |
---|---|---|
Alice | 90 | 85 |
Bob | 95 | 80 |
... | ... | ... |
解决方案
方法一:使用HashMap和ArrayList
我们可以使用HashMap和ArrayList来解决这个问题。首先,我们创建一个HashMap,以科目为键,对应的ArrayList为值。然后,我们遍历原始数据表,根据科目将成绩添加到对应的ArrayList中。最后,我们将结果整理成新的数据表。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RowToColumnConverter {
public static void main(String[] args) {
// 原始数据表
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", "Math", 90));
students.add(new Student("Alice", "English", 85));
students.add(new Student("Bob", "Math", 95));
students.add(new Student("Bob", "English", 80));
// 行转列
Map<String, List<Integer>> columns = new HashMap<>();
for (Student student : students) {
String subject = student.getSubject();
int score = student.getScore();
if (!columns.containsKey(subject)) {
columns.put(subject, new ArrayList<>());
}
columns.get(subject).add(score);
}
// 整理成新的数据表
List<Student> result = new ArrayList<>();
for (Map.Entry<String, List<Integer>> entry : columns.entrySet()) {
String subject = entry.getKey();
List<Integer> scores = entry.getValue();
for (int i = 0; i < scores.size(); i++) {
String name = students.get(i).getName();
int score = scores.get(i);
result.add(new Student(name, subject, score));
}
}
// 打印结果
for (Student student : result) {
System.out.println(student);
}
}
}
class Student {
private String name;
private String subject;
private int score;
public Student(String name, String subject, int score) {
this.name = name;
this.subject = subject;
this.score = score;
}
public String getName() {
return name;
}
public String getSubject() {
return subject;
}
public int getScore() {
return score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", subject='" + subject + '\'' +
", score=" + score +
'}';
}
}
方法二:使用二维数组
另一种解决方案是使用二维数组。我们可以先遍历原始数据表,确定需要创建的二维数组的行数和列数。然后,我们将成绩填充到对应的位置。最后,我们将结果整理成新的数据表。
import java.util.Arrays;
public class RowToColumnConverter {
public static void main(String[] args) {
// 原始数据表
String[][] students = {
{"Alice", "Math", "90"},
{"Alice", "English", "85"},
{"Bob", "Math", "95"},
{"Bob", "English", "80"}
};
// 行转列
int rows = Arrays.stream(students).mapToInt(s -> Integer.parseInt(s[0])).