Как вернуть экземпляр текущего класса в качестве значения внутри TreeMap? - PullRequest
0 голосов
/ 01 мая 2020

Мне нужно вернуть экземпляр класса, в котором я нахожусь в то время, как одну из переменных в TreeMap, которую я возвращаю основному классу. Я не могу понять, как я должен это сделать. Это мой код, чтобы показать вам, что я собираюсь сделать:

public class Employee {
    public static Map<String,Employee> load() {
       String a="";
       String b="";
       String [] c;
       TreeMap<String, Employee> d=new TreeMap<>();
        try {
            Scanner in=new Scanner(new File("employees.txt"));
            while(in.hasNextLine()){
                c=in.nextLine().split("  ");
                a=c[0];
                b=c[1];
            }
//Naturally, the "b" below has a red quiggly line under it as this is a string
            d.put(a,b);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
      return d;
    }
}

1 Ответ

3 голосов
/ 01 мая 2020

Вам нужно на самом деле построить Employee, используя new. Что-то вроде:

public class Employee {
    private final String name;

    public Employee(String name) {
        this.name = name;
    }

    public static Map<String,Employee> load() throws FileNotFoundException {
        TreeMap<String, Employee> map = new TreeMap<>();
        Scanner in = new Scanner(new File("employees.txt"));
        while(in.hasNextLine()) {
            String[] input = in.nextLine().split("  ");
            map.put(input[0], new Employee(input[1]));
        }
        return map;
    }
}

Лучшим дизайном было бы иметь ваши логики загрузки c в отдельном классе. Использование нескольких более свежих Java функций:

record Employee(String name) { }

public class EmployeeIndex {
    private final Map<String,Employee> index;

    public EmployeeIndex(String filename) {
        this.index = Files.lines(Paths.get(filename))
            .map(String::split)
            .collect(Collectors.toMap(a -> a[0], a -> new Employee(a[1]));
    }
}
...