Проблема java (чтение файла и создание объектов)

У меня есть проблема с Java, которую мне нужно сделать, и я не уверен, как это сделать. Это проблема:

Ваша задача — завершить данную программу, написав метод с именем readData и класс с именем Person. Метод readData написан внутри класса Customers. Цель программы - прочитать клиент информацию из файла с именем customers.txt, сделать новый объект из каждого клиента и, наконец, вывести на экран информацию обо всех клиентах.

В файле каждый клиент хранится на отдельной строке. Файл содержит имя и номер социального страхования каждого клиента. Класс Person имеет один атрибут типа String, в котором хранится информация о человеке (имя и номер социального страхования).

Внутри класса Person должен быть написан метод toString, который возвращает информацию о человеке. Метод readData получает в качестве параметра массив, в который помещаются созданные персоны. Цель метода — создать объект из каждого клиента в файле и поместить его в массив. Метод возвращает количество людей в файле.

Это инструкция (выше), а ниже — готовый код, который я не могу редактировать (за исключением части «ваш код здесь»):

import java.io.*;
import java.util.*;
import java.util.Scanner;

public class Customers {
     public static void main(String[] args) throws IOException {
     
        Person[] people = new Person[100];
        
        int peopleAmount = readData(people);
        
        for(int i = 0; i < peopleAmount; i++) {
            System.out.println(people[i]);
        }
    }

    // Your code here

Пример вывода:

James 030377-2651
John 111177-1731
Robert 161280-1822
Michael 121160-1362
William 141075-16

Если вы слишком заняты, чтобы дать полный ответ, некоторая информация о том, как это сделать, тоже подойдет. Текст инструкции изначально был не на английском языке, так что извините, если у него странная грамматика.

Ну а как информация хранится в customers.txt? Никто не может ответить без этой информации.

Charlie Armstrong 09.12.2020 19:56

@CharlieArmstrong Нет больше информации, чем написано в инструкции. Вывод примера показывает, как они печатаются, я полагаю. Также в инструкции есть такая часть: «В файле каждый клиент хранится на своей строке. Файл содержит имя и номер социального страхования каждого клиента». Таким образом, в файле, вероятно, просто есть имя каждого клиента, за которым следует их номер, разделенный на отдельные строки.

vghgh500 09.12.2020 20:20

@Abra Нет доступа к customers.txt для решения проблемы. Это требует, чтобы я построил его, используя только информацию, написанную в инструкциях. Но я предполагаю, что вывод примера - это то, как текст выглядит в файле.

vghgh500 09.12.2020 20:24

Чтобы добавить сюда, файл customers.txt существует, но я не могу его просмотреть. Так что чтение файла будет работать только с BufferedReader file = new BufferedReader(new FileReader(”customers.txt”)); я думаю

vghgh500 09.12.2020 20:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что содержимое файла customers.txt такое же, как в примере, выведенном в вашем вопросе, вот моя реализация. Я предполагаю, что вы можете использовать только классы, о которых вы узнали, и я также предполагаю, что вы еще не узнали о потоковом API в java, поэтому, надеюсь, приведенный ниже код приемлем в рамках ограничений вашего задания.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Customers {

    private static int readData(Person[] people) throws IOException {
        int count = 0;
        if (people != null && people.length > 0) {
            try (FileReader fr = new FileReader("customers.txt");
                 BufferedReader br = new BufferedReader(fr)) {
                String line = br.readLine();
                while (line != null) {
                    String[] parts = line.split(" ");
                    Person p = new Person(parts[0], parts[1]);
                    people[count] = p;
                    count++;
                    if (count >= people.length) {
                        break;
                    }
                    line = br.readLine();
                }
            }
        }
        return count;
    }

    public static void main(String[] args) throws IOException {
        Person[] people = new Person[100];
        int peopleAmount = readData(people);
        for(int i = 0; i < peopleAmount; i++) {
            System.out.println(people[i]);
        }
    }
}

class Person {
    String name;
    String ssn;

    public Person(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }

    public String toString() {
        return name + " " + ssn;
    }
}

Метод readData должен быть статическим, поскольку он вызывается из метода main, который является статическим методом.

Метод readData читает файл customers.txt построчно. Каждая строка содержит имя, за которым следует один пробел и номер социального страхования. В соответствии с вашим примером выходные данные имени и номера социального страхования не содержат пробелов. Если это не так, то приведенный выше код не будет работать.

Метод split создаст массив из двух элементов из строки файла. Первый элемент массива — это имя, а второй — номер социального страхования. Затем я создаю объект Person и помещаю его в массив people.

Просто пришлось изменить class Person на static class Person, так как в строке Person p = new Person(parts[0], parts[1]); он жаловался, что на Person нельзя ссылаться из статического контекста. После этого заработало. Спасибо.

vghgh500 09.12.2020 21:00

Другие вопросы по теме