You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:17:54