为了账号安全,请及时绑定邮箱和手机立即绑定

如何读取文件并保存到哈希图中,然后将第一个元素保存为键,其余元素保存在一个集合中?

如何读取文件并保存到哈希图中,然后将第一个元素保存为键,其余元素保存在一个集合中?

慕尼黑5688855 2021-06-14 19:31:17
我正在阅读一个带有疾病名称及其治疗方法的文件。因此,我想将名称保存为键,并将补救措施保存在一组中作为值。我怎么能达到那个?我的代码中似乎存在一些问题。public static HashMap<String,Set<String>> disease = new HashMap <> ();public static void main(String[] args) {Scanner fin = null;    try {        fin = new Scanner (new File ("diseases.txt"));        while (fin.hasNextLine()) {            HashSet <String> remedies = null;            String [] parts = fin.nextLine().split(",");                        int i = 1;            while (fin.hasNext()) {                remedies.add(parts[i].trim());                i++;            }            disease.put(parts[0],remedies);        }        fin.close();        }catch(Exception e) {        System.out.println("Error: " + e.getMessage());    }    finally {        try {fin.close();} catch(Exception e) {}    }    Set <String> result = disease.get("thrombosis");    display(result);    public static <T> void display (Set<T> items) {    if (items == null)        return;    int LEN = 80;    String line = "[";    for (T item:items) {        line+= item.toString() + ",";        if (line.length()> LEN) {            line = "";        }    }    System.out.println(line + "]");}这是我的代码癌症、疼痛、肿胀、出血、体重减轻痛风、疼痛、甲型肝炎肿胀、变色、不适、疲倦血栓形成,心率加快糖尿病,尿频这是txt包含的内容。
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

在您的代码中,您尚未初始化补救措施 HashSet(这就是它在第 14 行抛出 NullPointerException 的原因)。第二个问题是: i 递增 1 并且您没有检查 pats 数组的大小( i > parts.length) 。我编辑了你的代码:


    Scanner fin = null;

    try {


        fin = new Scanner(new File("diseases.txt"));

        while (fin.hasNextLine()) {

              HashSet<String> remedies = new HashSet<String>();

            String[] parts = fin.nextLine().split(",");

            int i = 1;

            while (fin.hasNext()&&parts.length>i) {

                remedies.add(parts[i].trim());

                i++;

            }


            disease.put(parts[0], remedies);



        }


查看完整回答
反对 回复 2021-06-17
?
温温酱

TA贡献1752条经验 获得超4个赞

你在这里有几个问题:

  1. 不需要内部 while 循环 ( while (fin.hasNext()) {) - 而是使用 `for(int i=1; i

  2. HashSet <String> remedies = null; - 这意味着集合未初始化,我们不能将项目放入其中 - 需要更改为: HashSet<String> remedies = new HashSet<>();

  3. 更好的做法close()是在finally零件中的文件

  4. 'display' 方法将在打印前删除该行(如果它超过 80 个字符)。

  5. 附加字符串时最好使用 StringBuilder

所以更正后的代码是:

import java.io.File;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Scanner;

import java.util.Set;


public class TestSOCode {

    public static HashMap<String,Set<String>> disease = new HashMap<>();

    private static int LINE_LENGTH = 80;


    public static void main(String[] args) {


        Scanner fin = null;

        try {


            fin = new Scanner(new File("diseases.txt"));

            while (fin.hasNextLine()) {

                HashSet<String> remedies = new HashSet<>();

                String[] parts = fin.nextLine().split(",");


                disease.put(parts[0], remedies);


                for (int i = 1; i < parts.length; i++) {

                    remedies.add(parts[i].trim());

                }

            }

        } catch (Exception e) {

            System.out.println("Error: " + e.getMessage());

        } finally {

            try {

                fin.close();

            } catch (Exception e) {

                System.out.println("Error when closing file: " + e.getMessage());

            }

        }


        Set<String> result = disease.get("thrombosis");

        display(result);

    }


    public static <T> void display (Set<T> items) {

        if (items == null)

            return;


        StringBuilder line = new StringBuilder("[");

        int currentLength = 1; // start from 1 because of the '[' char

        for (T item:items) {

            String itemStr = item.toString();

            line.append(itemStr).append(",");

            currentLength += itemStr.length() + 1; // itemStr length plus the ',' char

            if (currentLength >= LINE_LENGTH) {

                line.append("\n");

                currentLength = 0;

            }

        }


        // replace last ',' with ']'

        line.replace(line.length() - 1, line.length(), "]");



        System.out.println(line.toString());

    }

}


查看完整回答
反对 回复 2021-06-17
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信