我的 toString 有一个包含字符串 printet 行的文件,如下所示:
[名称:值][年龄:值][cpr编号:值][组: 值][活动:值][平均成绩:浮动值]
我有一个带有读取方法的类,它读取文件并将每一行作为 ArrayList 中的对象返回。
现在回到我的主类,我试图查看列表中的每个对象,这就是我卡住的地方。我正在尝试查找平均等级高于 4 的对象。有人可以帮我正确的正则表达式吗?
我的 toString 有一个包含字符串 printet 行的文件,如下所示:
[名称:值][年龄:值][cpr编号:值][组: 值][活动:值][平均成绩:浮动值]
我有一个带有读取方法的类,它读取文件并将每一行作为 ArrayList 中的对象返回。
现在回到我的主类,我试图查看列表中的每个对象,这就是我卡住的地方。我正在尝试查找平均等级高于 4 的对象。有人可以帮我正确的正则表达式吗?
您可以使用正则表达式解析每个String
并将键-> 值对放入Map
. 如果需要,这将允许您访问其他值。
您需要做的就是,在循环中,从 the 中获取密钥Map
并将其解析为 afloat
并检查它的值
public static void main(String[] args) throws ParseException {
final String[] strings = new String[]{
"[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]",
"[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]",
"[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]",
"[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]"
};
final Pattern pattern = Pattern.compile("\\[([^:]++):\\s([^]]++)]");
final Collection<Float> grades = new LinkedList<Float>();
for (final String string : strings) {
final Map<String, String> map = new HashMap<>();
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
final String key = matcher.group(1).trim();
final String value = matcher.group(2).trim();
map.put(key, value);
}
System.out.println(map);
final float grade = Float.parseFloat(map.get("Average Grade"));
if (grade > 4) {
grades.add(grade);
}
}
}
输出:
{Name=Bob, Active=true, cprNumber=1234, age=27, Average Grade=4.1, group=A}
{Name=Alice, Active=true, cprNumber=4321, age=17, Average Grade=4.5, group=A}
{Name=James, Active=true, cprNumber=2134, age=33, Average Grade=2.2, group=B}
{Name=Frank, Active=false, cprNumber=3124, age=23, Average Grade=3.1, group=B}
[4.1, 4.5]
这个例子有 aString[]
但使用 aList
不会有任何区别。
您可以创建一个Object
来保存该值 - 这将是一种更面向对象的方法。
编辑
这是一个使用spilt
. 它的硬编码要多得多-
public static void main(String[] args) throws ParseException {
final String[] strings = new String[]{
"[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]",
"[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]",
"[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]",
"[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]"
};
final Collection<Float> grades = new LinkedList<Float>();
for (final String string : strings) {
final String[] values = string.split("[\\[\\]]+|:");
final float gpa = Float.parseFloat(values[12].trim());
if (gpa > 4) {
grades.add(gpa);
}
}
System.out.println(grades);
}
输出是一样的:
[4.1, 4.5]
正则表达式不适合数字计算/比较。
如果您的问题中的双引号确实存在于您的文件中。对于您的示例,您可以只获得一行,这将为您提供浮点数(在字符串中)。
row.split("\\"")[1];
然后你可以检查上面的值>4
,你可能需要先将其转换为数字。
如果你可以使用第三部分库,番石榴有一个很好的filter()
功能,你可以看看。
编辑
如果双引号不在您的文件中,您仍然可以使用split()
String[] arr=row.split("(: |])");
arr[arr.length-1] //this is the float
例如:
final String[] arr = "[Name: value][age: value][cprNumber: value][group: value][Active: value][Average Grade: 4343.0]".split("(: |])");
System.out.println(arr[arr.length - 1]);
输出:
4343.0