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

时间:2018-07-30 06:56:32

标签: java

我正在阅读带有疾病名称及其补救措施的文件。因此,我想将名称保存为键,并将补救措施保存为值。我怎样才能做到这一点?我的代码似乎有一些问题。

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 个答案:

答案 0 :(得分:1)

在您的代码中,您尚未初始化补救方法HashSet(这就是为什么它在第14行抛出NullPointerException的原因)。 第二个问题是:我的增量为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);


        }

答案 1 :(得分:0)

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.io.File;
import java.util.Set;

public class Solution {

    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 = new HashSet<>();
                String [] parts = fin.nextLine().split(",");            
                for (int i=1; i < parts.length; i++) {
                    remedies.add(parts[i].trim());
                }
                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 + "]");
    }

}

这里是完整的工作代码。正如@Pratik所建议的那样,您忘记了初始化HashSet的原因,这就是Nul​​lPointerException错误到来的原因。

答案 2 :(得分:0)

您在这里遇到一些问题:

  1. 不需要内部while循环(while (fin.hasNext()) {)-而是使用`for(int i = 1; i
  2. HashSet <String> remedies = null;-这意味着该集合未初始化,我们无法在其中放入项目-需更改为:HashSet<String> remedies = new HashSet<>();
  3. close()部分中finally文件是一种更好的做法
  4. “显示”方法将在打印之前删除该行(如果长度超过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());
    }
}