Java读取data.txt并实现指定匹配查询功能遇阻求助
嘿,我来帮你解决这两个问题——先是数组打印的奇怪输出,然后是实现你需要的函数。
第一个问题:为什么split后打印数组会出现[Ljava.lang.String;@xxx?
在Java里,直接打印数组对象时,默认的toString()方法只会输出数组的类型标识和哈希码,不会显示数组里的具体元素。要看到拆分后的内容,你需要用Arrays.toString()方法来格式化数组,记得要导入java.util.Arrays包。
修复后的代码如下:
import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; public class FileReaderFix { public static void main(String[] args) { String fileName = "data.txt"; try(var stream = Files.lines(Paths.get(fileName), StandardCharsets.UTF_8)){ stream.forEach(line -> { String[] newline = line.split(","); // 用Arrays.toString打印数组的实际内容 System.out.println(Arrays.toString(newline)); }); } catch (Exception e) { e.printStackTrace(); } } }
运行这段代码后,你就能看到每行拆分后的具体元素了,比如[B, C, 1, 360, 370, 380, 390, 400, 410, 420]。
第二个问题:实现你需要的Function(String s1, String s2, int x)函数
先结合你的示例明确需求逻辑:
- 筛选出每行第一个值等于
s1、第二个值等于s2的行 - 根据你的示例,我们需要找到x所在的数值区间对应的行:比如x=364落在
[360, 365)区间(对应第一行B,C,1),返回1;x=366落在[365, 370)区间(对应第二行B,C,2),返回2。本质是找到符合条件的行中,第一个数值(第三个逗号后的第一个值)是小于等于x的最大值,返回该行的第二个逗号后的内容。
实现这个逻辑的代码如下:
import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Optional; public class DataLookupFunction { public static String function(String s1, String s2, int x) { String fileName = "data.txt"; Optional<String> targetResult = Optional.empty(); int maxMatchingFirstNum = Integer.MIN_VALUE; try(var stream = Files.lines(Paths.get(fileName), StandardCharsets.UTF_8)){ for(String line : (Iterable<String>) stream::iterator){ String[] lineParts = line.split(","); // 先检查行的格式是否符合要求,以及s1、s2是否匹配 if(lineParts.length >= 4 && lineParts[0].equals(s1) && lineParts[1].equals(s2)){ try { int firstNumInRow = Integer.parseInt(lineParts[3]); // 找到第一个数值<=x且是目前最大的那个行 if(firstNumInRow <= x && firstNumInRow > maxMatchingFirstNum){ maxMatchingFirstNum = firstNumInRow; targetResult = Optional.of(lineParts[2]); } } catch(NumberFormatException e){ // 处理行中存在非数字的情况 System.err.println("Warning: Invalid number in line: " + line); } } } } catch (Exception e) { e.printStackTrace(); return null; } // 如果找到匹配的结果就返回,否则返回null return targetResult.orElse(null); } public static void main(String[] args) { // 测试你的示例 System.out.println(function("B", "C", 364)); // 输出1 System.out.println(function("B", "C", 366)); // 输出2 } }
如果你确实需要严格按照你描述的“找到第三个逗号起第一个大于x的值对应的行”(即所有符合条件的行中,第一个出现大于x的数值所在的行),可以用下面的代码,但注意这个逻辑下function("B", "C", 366)会返回1,和你的示例不符:
import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Optional; public class DataLookupAlternative { public static String function(String s1, String s2, int x) { String fileName = "data.txt"; try(var stream = Files.lines(Paths.get(fileName), StandardCharsets.UTF_8)){ for(String line : (Iterable<String>) stream::iterator){ String[] lineParts = line.split(","); if(lineParts.length >= 4 && lineParts[0].equals(s1) && lineParts[1].equals(s2)){ // 遍历该行从第三个逗号开始的数值 for(int i=3; i<lineParts.length; i++){ try { int num = Integer.parseInt(lineParts[i]); if(num > x){ // 找到第一个大于x的数值,直接返回该行的目标内容 return lineParts[2]; } } catch(NumberFormatException e){ System.err.println("Warning: Invalid number in line: " + line); break; } } } } } catch (Exception e) { e.printStackTrace(); return null; } // 没有找到符合条件的数值时返回null return null; } public static void main(String[] args) { System.out.println(function("B", "C", 364)); // 输出1 System.out.println(function("B", "C", 366)); // 输出1(和你的示例不符) } }
内容的提问来源于stack exchange,提问作者Hoàng Phạm
相关产品推荐
相关产品推荐

