编写一个Java程序,假设文本文件 data.txt 如下: 学号 姓名 性别 省份 出生年月 成绩 -------------------------------------- 1001 小王 男 湖北 1998-11-12 90 1002 小刘 女 北京 1997-01-12 60.5 1003 小张 女 湖南 1997-11-01 86 1004 王艳 男 广东 1998-11-14 55 1005 刘华 女 云南 1998-09-12 76 1006 李华 男 贵州 1998-07-12 92 1007 张艳 女 湖北 1998-10-12 66 从键盘中输入以下格式的字符串 select 字段列表 where 条件 如 select 姓名 性别 省份 出生年月 where 性别=男, 显示所有男同学的姓名,性别,省份,出生年月 select 学号 性别 省份 成绩 where 省份=湖北, 显示所有湖北同学的学号,性别,省份,成绩
时间: 2023-06-11 12:04:43 浏览: 118
学号+姓名-java.docx
好的,您的问题是如何编写一个Java程序,根据指定的格式从文本文件中检索数据并输出查询结果。实际上,您可以采用如下的步骤来实现:
1. 读取输入字符串,解析出要查询的字段列表以及查询条件,存储在相应的变量中。
2. 打开指定的文本文件,并逐行读取数据,对每一行进行解析,存储在一个数据结构中(如List of Map)。
3. 对数据进行过滤,只保留符合查询条件的部分,排除不符合条件的行。
4. 输出查询结果,按照指定的字段列表进行打印。
下面是一份参考代码,仅供您参考:
```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class QueryData {
public static void main(String[] args) {
// 从键盘读入查询条件
Scanner scanner = new Scanner(System.in);
System.out.print("请输入查询语句:");
String query = scanner.nextLine();
// 解析查询语句
String[] fields = query.substring(query.indexOf("select") + 7, query.indexOf("where")).trim().split("\\s+");
String[] conditions = query.substring(query.indexOf("where") + 5).trim().split("\\s+");
// 读取数据文件并进行查询
List<Map<String, Object>> data = readDataFile("data.txt");
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> record : data) {
boolean match = true;
for (int i = 0; i < conditions.length; i += 3) {
String key = conditions[i];
String op = conditions[i + 1];
String value = conditions[i + 2];
if (!compare(record.get(key), op, value)) {
match = false;
break;
}
}
if (match) {
Map<String, Object> row = new HashMap<>();
for (String field : fields) {
row.put(field, record.get(field));
}
result.add(row);
}
}
// 输出查询结果
for (Map<String, Object> row : result) {
for (String field : fields) {
System.out.print(row.get(field) + "\t");
}
System.out.println();
}
}
/**
* 读取数据文件,将每一行解析成一个 Map 返回。
*/
private static List<Map<String, Object>> readDataFile(String filename) {
List<Map<String, Object>> data = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String header = reader.readLine();
String[] keys = header.trim().split("\\s+");
String line;
while ((line = reader.readLine()) != null) {
String[] values = line.trim().split("\\s+");
if (values.length != keys.length) {
System.err.println("数据文件格式错误:" + line);
continue;
}
Map<String, Object> record = new HashMap<>();
for (int i = 0; i < keys.length; i++) {
record.put(keys[i], values[i]);
}
data.add(record);
}
} catch (IOException e) {
System.err.println("读取数据文件出错:" + e.getMessage());
}
return data;
}
/**
* 根据操作符比较两个值的大小。
*/
private static boolean compare(Object left, String op, String right) {
int cmp = 0;
if (left instanceof Integer) {
cmp = ((Integer) left).compareTo(Integer.parseInt(right));
} else if (left instanceof Double) {
cmp = ((Double) left).compareTo(Double.parseDouble(right));
} else if (left instanceof String) {
cmp = ((String) left).compareTo(right);
} else {
System.err.println("不支持的值类型:" + left.getClass().getName());
return false;
}
switch (op) {
case "=":
return cmp == 0;
case "<":
return cmp < 0;
case ">":
return cmp > 0;
case "<=":
return cmp <= 0;
case ">=":
return cmp >= 0;
default:
System.err.println("不支持的操作符:" + op);
return false;
}
}
}
```
希望这份代码能够帮助您完成您的任务。如果有什么不明白的地方,可以继续提问哦!
阅读全文