编写DataExtract.java类,随机从数据文件data.txt中抽取N个学生,并将结果写入result.txt文件中。
时间: 2023-09-04 10:05:00 浏览: 100
### 回答1:
以下是一个可能的解决方案:
```java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class DataExtract {
public static void main(String[] args) {
String inputFileName = "data.txt";
String outputFileName = "result.txt";
int N = 10; // 抽取的学生数量
try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) {
List<String> lines = new ArrayList<>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
Collections.shuffle(lines); // 随机打乱顺序
for (int i = 0; i < N && i < lines.size(); i++) {
writer.write(lines.get(i));
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这个程序首先读取指定的文件,将每一行存储到一个 `List<String>` 中。然后使用 `Collections.shuffle()` 方法将列表中的元素随机打乱顺序。接着从列表中取出前 N 个元素,将它们写入到另一个文件中。注意在写入时要用 `BufferedWriter.newLine()` 方法换行。
这个程序的缺点是,如果输入文件非常大,一次性将所有行读入内存可能会导致内存溢出。如果需要处理大文件,可以考虑逐行读取并随机抽取。
### 回答2:
下面是一个简单的DataExtract.java类,用于从数据文件data.txt中随机抽取N个学生,并将结果写入result.txt文件中。
```java
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class DataExtract {
public static void main(String[] args) {
int N = 5; // 需要抽取的学生数量
List<String> studentList = readDataFromFile("data.txt");
List<String> result = new ArrayList<>();
int totalStudents = studentList.size();
if (totalStudents <= N) {
result = studentList; // 如果数据文件中的学生数量小于等于N,直接将所有学生加入结果列表
} else {
Random random = new Random();
for (int i = 0; i < N; i++) {
int index = random.nextInt(totalStudents); // 随机生成索引
result.add(studentList.get(index));
studentList.remove(index); // 从原列表中移除已抽取的学生
totalStudents--; // 更新学生数量
}
}
writeDataToFile(result, "result.txt");
}
private static List<String> readDataFromFile(String filename) {
List<String> studentList = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader(filename));
String line;
while ((line = br.readLine()) != null) {
studentList.add(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return studentList;
}
private static void writeDataToFile(List<String> data, String filename) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
for (String student : data) {
bw.write(student);
bw.newLine();
}
bw.close();
System.out.println("抽取的学生已写入result.txt文件中。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
说明:
1. 首先,我们定义了一个N变量来表示需要抽取的学生数量,这里假设为5。
2. 然后,我们使用readDataFromFile方法从数据文件data.txt中读取所有学生信息,并将其存储在studentList列表中。
3. 接下来,我们判断数据文件中的学生数量是否小于等于N。如果是,说明数据文件中的所有学生都要被抽取,直接将studentList赋值给result列表即可。如果不是,则需要进行抽取操作。
4. 我们使用Random类来生成随机索引,然后依次从studentList中获取学生信息,并将其加入result列表中,同时从studentList中移除已经抽取的学生。我们采用这种方式来确保每次抽取的学生都不重复。
5. 最后,我们使用writeDataToFile方法将抽取的学生信息写入result.txt文件中,每个学生信息占一行。
6. 在writeDataToFile方法中,我们使用BufferedWriter类将学生信息逐行写入文件,并在写入完毕后关闭文件流。
以上就是一个简单的实现,可以根据实际需求进行修改和扩展。
阅读全文